Vulkan doesn't have a conversion from uint32_t/int32_t to float. It does have conversions from 16/8 bits. Main reason is that Vulkan expects that there is no benefit when converting 32 bits from one type to the other and should be solved by passing the right data type. In Blender however this isn't the case as there are benefits on other GPU backends (OpenGL for example). This PR adds helper function to check if conversion is needed and perform any conversions in place. It also implements the function to upload vertex buffers to the GPU. NOTE: Test cases have been added to validate this, but they are not able to run on the Vulkan backend just yet, because they require the graphics pipeline to be available. Pull Request: https://projects.blender.org/blender/blender/pulls/107733
101 lines
3.7 KiB
C++
101 lines
3.7 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2023 Blender Foundation */
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <typeinfo>
|
|
|
|
#ifdef __APPLE__
|
|
# include <MoltenVK/vk_mvk_moltenvk.h>
|
|
#else
|
|
# include <vulkan/vulkan.h>
|
|
#endif
|
|
|
|
#include "vk_mem_alloc.h"
|
|
|
|
#include "gpu_index_buffer_private.hh"
|
|
#include "gpu_texture_private.hh"
|
|
|
|
namespace blender::gpu {
|
|
|
|
VkImageAspectFlagBits to_vk_image_aspect_flag_bits(const eGPUTextureFormat format);
|
|
VkFormat to_vk_format(const eGPUTextureFormat format);
|
|
VkFormat to_vk_format(const GPUVertCompType type,
|
|
const uint32_t size,
|
|
const GPUVertFetchMode fetch_mode);
|
|
VkComponentMapping to_vk_component_mapping(const eGPUTextureFormat format);
|
|
VkImageViewType to_vk_image_view_type(const eGPUTextureType type);
|
|
VkImageType to_vk_image_type(const eGPUTextureType type);
|
|
VkClearColorValue to_vk_clear_color_value(const eGPUDataFormat format, const void *data);
|
|
VkIndexType to_vk_index_type(const GPUIndexBufType index_type);
|
|
VkPrimitiveTopology to_vk_primitive_topology(const GPUPrimType prim_type);
|
|
VkCullModeFlags to_vk_cull_mode_flags(const eGPUFaceCullTest cull_test);
|
|
|
|
template<typename T> VkObjectType to_vk_object_type(T /*vk_obj*/)
|
|
{
|
|
const std::type_info &tid = typeid(T);
|
|
#define VK_EQ_TYPEID(name, name2) \
|
|
if (tid == typeid(name)) { \
|
|
return VK_OBJECT_TYPE_##name2; \
|
|
}
|
|
|
|
VK_EQ_TYPEID(VkInstance, INSTANCE);
|
|
VK_EQ_TYPEID(VkPhysicalDevice, PHYSICAL_DEVICE);
|
|
VK_EQ_TYPEID(VkDevice, DEVICE);
|
|
VK_EQ_TYPEID(VkQueue, QUEUE);
|
|
VK_EQ_TYPEID(VkSemaphore, SEMAPHORE);
|
|
VK_EQ_TYPEID(VkCommandBuffer, COMMAND_BUFFER);
|
|
VK_EQ_TYPEID(VkFence, FENCE);
|
|
VK_EQ_TYPEID(VkDeviceMemory, DEVICE_MEMORY);
|
|
VK_EQ_TYPEID(VkBuffer, BUFFER);
|
|
VK_EQ_TYPEID(VkImage, IMAGE);
|
|
VK_EQ_TYPEID(VkEvent, EVENT);
|
|
VK_EQ_TYPEID(VkQueryPool, QUERY_POOL);
|
|
VK_EQ_TYPEID(VkBufferView, BUFFER_VIEW);
|
|
VK_EQ_TYPEID(VkImageView, IMAGE_VIEW);
|
|
VK_EQ_TYPEID(VkShaderModule, SHADER_MODULE);
|
|
VK_EQ_TYPEID(VkPipelineCache, PIPELINE_CACHE);
|
|
VK_EQ_TYPEID(VkPipelineLayout, PIPELINE_LAYOUT);
|
|
VK_EQ_TYPEID(VkRenderPass, RENDER_PASS);
|
|
VK_EQ_TYPEID(VkPipeline, PIPELINE);
|
|
VK_EQ_TYPEID(VkDescriptorSetLayout, DESCRIPTOR_SET_LAYOUT);
|
|
VK_EQ_TYPEID(VkSampler, SAMPLER);
|
|
VK_EQ_TYPEID(VkDescriptorPool, DESCRIPTOR_POOL);
|
|
VK_EQ_TYPEID(VkDescriptorSet, DESCRIPTOR_SET);
|
|
VK_EQ_TYPEID(VkFramebuffer, FRAMEBUFFER);
|
|
VK_EQ_TYPEID(VkCommandPool, COMMAND_POOL);
|
|
VK_EQ_TYPEID(VkSamplerYcbcrConversion, SAMPLER_YCBCR_CONVERSION);
|
|
VK_EQ_TYPEID(VkDescriptorUpdateTemplate, DESCRIPTOR_UPDATE_TEMPLATE);
|
|
VK_EQ_TYPEID(VkSurfaceKHR, SURFACE_KHR);
|
|
VK_EQ_TYPEID(VkSwapchainKHR, SWAPCHAIN_KHR);
|
|
VK_EQ_TYPEID(VkDisplayKHR, DISPLAY_KHR);
|
|
VK_EQ_TYPEID(VkDisplayModeKHR, DISPLAY_MODE_KHR);
|
|
VK_EQ_TYPEID(VkDebugReportCallbackEXT, DEBUG_REPORT_CALLBACK_EXT);
|
|
#ifdef VK_ENABLE_BETA_EXTENSIONS
|
|
VK_EQ_TYPEID(VkVideoSessionKHR, VIDEO_SESSION_KHR);
|
|
#endif
|
|
#ifdef VK_ENABLE_BETA_EXTENSIONS
|
|
VK_EQ_TYPEID(VkVideoSessionParametersKHR, VIDEO_SESSION_PARAMETERS_KHR);
|
|
#endif
|
|
VK_EQ_TYPEID(VkCuModuleNVX, CU_MODULE_NVX);
|
|
VK_EQ_TYPEID(VkCuFunctionNVX, CU_FUNCTION_NVX);
|
|
VK_EQ_TYPEID(VkDebugUtilsMessengerEXT, DEBUG_UTILS_MESSENGER_EXT);
|
|
VK_EQ_TYPEID(VkAccelerationStructureKHR, ACCELERATION_STRUCTURE_KHR);
|
|
VK_EQ_TYPEID(VkValidationCacheEXT, VALIDATION_CACHE_EXT);
|
|
VK_EQ_TYPEID(VkAccelerationStructureNV, ACCELERATION_STRUCTURE_NV);
|
|
VK_EQ_TYPEID(VkPerformanceConfigurationINTEL, PERFORMANCE_CONFIGURATION_INTEL);
|
|
VK_EQ_TYPEID(VkDeferredOperationKHR, DEFERRED_OPERATION_KHR);
|
|
VK_EQ_TYPEID(VkIndirectCommandsLayoutNV, INDIRECT_COMMANDS_LAYOUT_NV);
|
|
VK_EQ_TYPEID(VkPrivateDataSlotEXT, PRIVATE_DATA_SLOT_EXT);
|
|
|
|
BLI_assert_unreachable();
|
|
#undef VK_EQ_TYPEID
|
|
return VK_OBJECT_TYPE_UNKNOWN;
|
|
}
|
|
|
|
} // namespace blender::gpu
|