37 case VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT:
38 return (stencil) ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_DEPTH_BIT;
47 if (vk_image_ != VK_NULL_HANDLE && allocation_ != VK_NULL_HANDLE) {
49 vk_image_ = VK_NULL_HANDLE;
50 allocation_ = VK_NULL_HANDLE;
81 context.render_graph().add_node(update_mipmaps);
89 copy_image.
node_data.
region.srcSubresource.aspectMask = vk_image_aspect;
91 copy_image.
node_data.
region.srcSubresource.layerCount = vk_layer_count(1);
92 copy_image.
node_data.
region.dstSubresource.aspectMask = vk_image_aspect;
94 copy_image.
node_data.
region.dstSubresource.layerCount = vk_layer_count(1);
99 context.render_graph().add_node(copy_image);
108 BLI_assert(src->device_format_ == dst->device_format_);
118 float clear_depth = 0.0f;
140 context.render_graph().add_node(clear_color_image);
146 std::optional<int> layer)
152 vk_image_aspect_device;
153 if (vk_image_aspect == VK_IMAGE_ASPECT_NONE) {
165 VK_REMAINING_ARRAY_LAYERS;
166 if (layer.has_value()) {
171 VK_REMAINING_MIP_LEVELS;
174 context.render_graph().add_node(clear_depth_stencil_image);
179 memcpy(swizzle_, swizzle_mask, 4);
191 const int3 extent =
int3(region[3] - region[0], region[4] - region[1], region[5] - region[2]);
192 size_t sample_len = extent.x * extent.y * extent.z * layers.
size();
196 size_t device_memory_size = sample_len *
to_bytesize(device_format_);
197 staging_buffer.
create(device_memory_size,
198 VK_BUFFER_USAGE_TRANSFER_DST_BIT,
199 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
200 VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
203 VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT |
204 VMA_ALLOCATION_CREATE_MAPPED_BIT,
211 node_data.
region.imageOffset.x = region[0];
212 node_data.
region.imageOffset.y = region[1];
213 node_data.
region.imageOffset.z = region[2];
214 node_data.
region.imageExtent.width = extent.x;
215 node_data.
region.imageExtent.height = extent.y;
216 node_data.
region.imageExtent.depth = extent.z;
221 node_data.
region.imageSubresource.mipLevel = mip;
222 node_data.
region.imageSubresource.baseArrayLayer = layers.
start();
223 node_data.
region.imageSubresource.layerCount = layers.
size();
226 context.rendering_end();
227 context.render_graph().add_node(copy_image_to_buffer);
241 int mip_size[3] = {1, 1, 1};
244 switch (vk_image_type) {
245 case VK_IMAGE_TYPE_1D: {
249 case VK_IMAGE_TYPE_2D: {
252 case VK_IMAGE_TYPE_3D:
257 if (mip_size[2] == 0) {
261 size_t sample_len = mip_size[0] * mip_size[1] * mip_size[2] * layers.
size();
265 int region[6] = {0, 0, 0, mip_size[0], mip_size[1], mip_size[2]};
282 int3 offset =
int3(offset_[0], offset_[1], offset_[2]);
287 start_layer = offset.y;
295 start_layer = offset.z;
302 size_t sample_len = size_t(extent.x) * extent.y * extent.z * layers;
303 size_t device_memory_size = sample_len *
to_bytesize(device_format_);
306 BLI_assert_msg(extent.z == 1,
"Compressed 3D textures are not supported");
310 device_memory_size = blocks_x * blocks_y * block_size;
313 sample_len = device_memory_size /
to_bytesize(device_format_);
317 VkBuffer vk_buffer = VK_NULL_HANDLE;
319 staging_buffer.
create(device_memory_size,
320 VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
321 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
322 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
323 VMA_ALLOCATION_CREATE_MAPPED_BIT |
324 VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT,
330 const uint texture_unpack_row_length =
331 context.state_manager_get().texture_unpack_row_length_get();
332 if (
ELEM(texture_unpack_row_length, 0, extent.x)) {
338 "Compressed data with texture_unpack_row_length != 0 is not supported.");
339 size_t dst_row_stride = extent.x *
to_bytesize(device_format_);
342 const uint8_t *src_ptr =
static_cast<const uint8_t *
>(
data);
343 for (
int x = 0;
x < extent.x;
x++) {
345 src_ptr += src_row_stride;
346 dst_ptr += dst_row_stride;
359 node_data.
region.imageExtent.width = extent.x;
360 node_data.
region.imageExtent.height = extent.y;
361 node_data.
region.imageExtent.depth = extent.z;
362 node_data.
region.imageOffset.x = offset.x;
363 node_data.
region.imageOffset.y = offset.y;
364 node_data.
region.imageOffset.z = offset.z;
369 node_data.
region.imageSubresource.mipLevel = mip;
370 node_data.
region.imageSubresource.baseArrayLayer = start_layer;
371 node_data.
region.imageSubresource.layerCount = layers;
373 context.render_graph().add_node(copy_buffer_to_image);
385 GPUPixelBuffer *pixbuf)
403 "Can only import external memory when usage flag contains GPU_TEXTURE_USAGE_MEMORY_EXPORT.");
405 "Cannot export memory when the texture is not backed by any device memory.");
407 "Requested to export memory, but isn't supported by the device");
408 if (handle_type == VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT) {
409 VkMemoryGetFdInfoKHR vk_memory_get_fd_info = {VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
411 allocation_info_.deviceMemory,
415 return {
uint64_t(fd_handle), allocation_info_.size, allocation_info_.offset};
419 if (handle_type == VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT) {
420 VkMemoryGetWin32HandleInfoKHR vk_memory_get_win32_handle_info = {
421 VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR,
423 allocation_info_.deviceMemory,
425 HANDLE win32_handle =
nullptr;
427 device.
vk_handle(), &vk_memory_get_win32_handle_info, &win32_handle);
428 return {
uint64_t(win32_handle), allocation_info_.size, allocation_info_.offset};
467 source_buffer_ =
unwrap(vbo);
478 device_format_ =
texture->device_format_;
481 layer_offset_ = layer_offset;
482 use_stencil_ = use_stencil;
487bool VKTexture::is_texture_view()
const
489 return source_texture_ !=
nullptr;
499 VkImageUsageFlags
result = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
500 VK_IMAGE_USAGE_SAMPLED_BIT;
502 result |= VK_IMAGE_USAGE_STORAGE_BIT;
505 result |= VK_IMAGE_USAGE_STORAGE_BIT;
514 result |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
517 result |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
518 if (supports_local_read || (!supports_dynamic_rendering)) {
519 result |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
525 result |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
531 result &= ~VK_IMAGE_USAGE_STORAGE_BIT;
535 result &= ~VK_IMAGE_USAGE_STORAGE_BIT;
545 VkImageCreateFlags
result = 0;
548 result |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
553 result |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
570bool VKTexture::allocate()
575 VkExtent3D vk_extent = vk_extent_3d(0);
578 if (vk_extent.depth > limit || vk_extent.height > limit || vk_extent.depth > limit) {
585 VkImageCreateInfo image_info = {};
586 image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
589 image_info.extent = vk_extent;
591 image_info.arrayLayers = vk_layer_count(1);
598 image_info.tiling = VK_IMAGE_TILING_OPTIMAL;
599 image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
601 image_info.samples = VK_SAMPLE_COUNT_1_BIT;
605 VkImageFormatProperties image_format = {};
606 result = vkGetPhysicalDeviceImageFormatProperties(device.physical_device_get(),
608 image_info.imageType,
613 if (
result != VK_SUCCESS) {
614 printf(
"Image type not supported on device.\n");
619 VkExternalMemoryImageCreateInfo external_memory_create_info = {
620 VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
nullptr, 0};
622 VmaAllocationCreateInfo allocCreateInfo = {};
623 allocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;
627 image_info.pNext = &external_memory_create_info;
629 external_memory_create_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
631 external_memory_create_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
633 allocCreateInfo.pool = device.vma_pools.external_memory;
635 result = vmaCreateImage(device.mem_allocator_get(),
641 if (
result != VK_SUCCESS) {
646 device.resources.add_image(vk_image_, image_info.arrayLayers,
name_);
648 return result == VK_SUCCESS;
655IndexRange VKTexture::mip_map_range()
const
660IndexRange VKTexture::layer_range()
const
662 if (is_texture_view()) {
671int VKTexture::vk_layer_count(
int non_layered_value)
const
673 if (is_texture_view()) {
681VkExtent3D VKTexture::vk_extent_3d(
int mip_level)
const
683 int extent[3] = {1, 1, 1};
699 if (is_texture_view()) {
704 for (
const VKImageView &image_view : image_views_) {
705 if (image_view.info == info) {
711 return image_views_.last();
716 image_view_info_.mip_range = mip_map_range();
717 image_view_info_.use_srgb =
true;
718 image_view_info_.use_stencil = use_stencil_;
719 image_view_info_.arrayed = arrayed;
720 image_view_info_.layer_range = layer_range();
723 image_view_info_.layer_range = image_view_info_.layer_range.slice(
728 image_view_info_.swizzle[0] =
'r';
729 image_view_info_.swizzle[1] =
'g';
730 image_view_info_.swizzle[2] =
'b';
731 image_view_info_.swizzle[3] =
'a';
734 image_view_info_.swizzle[0] = swizzle_[0];
735 image_view_info_.swizzle[1] = swizzle_[1];
736 image_view_info_.swizzle[2] = swizzle_[2];
737 image_view_info_.swizzle[3] = swizzle_[3];
740 if (is_texture_view()) {
741 return source_texture_->image_view_get(image_view_info_);
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
MINLINE uint divide_ceil_u(uint a, uint b)
MINLINE int max_ii(int a, int b)
#define UNUSED_VARS_NDEBUG(...)
int GPU_max_texture_3d_size()
int GPU_max_texture_size()
@ GPU_TEXTURE_USAGE_MEMORY_EXPORT
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_SHADER_WRITE
@ GPU_TEXTURE_USAGE_HOST_READ
@ GPU_TEXTURE_USAGE_ATTACHMENT
BMesh const char void * data
unsigned long long int uint64_t
constexpr int64_t size() const
constexpr int64_t start() const
eGPUTextureFormat format_
eGPUTextureFormatFlag format_flag_
eGPUTextureUsage gpu_image_usage_flags_
eGPUTextureUsage usage_get() const
char name_[DEBUG_NAME_LEN]
eGPUTextureType type_get() const
void mip_size_get(int mip, int r_size[3]) const
Texture(const char *name)
bool create(size_t size, VkBufferUsageFlags buffer_usage, VkMemoryPropertyFlags required_flags, VkMemoryPropertyFlags preferred_flags, VmaAllocationCreateFlags vma_allocation_flags, float priority, bool export_memory=false)
VkBuffer vk_handle() const
void * mapped_memory_get() const
PFN_vkGetMemoryFdKHR vkGetMemoryFd
VkDevice vk_handle() const
const VKExtensions & extensions_get() const
struct blender::gpu::VKDevice::@357253123303341036353224041006002133032155310370 functions
const VKWorkarounds & workarounds_get() const
static VKDiscardPool & discard_pool_get()
void discard_image(VkImage vk_image, VmaAllocation vma_allocation)
VKMemoryExport export_memory(VkExternalMemoryHandleTypeFlagBits handle_type)
void clear_depth_stencil(const eGPUFrameBufferBits buffer, float clear_depth, uint clear_stencil, std::optional< int > layer)
uint gl_bindcode_get() const override
void copy_to(Texture *tex) override
void clear(eGPUDataFormat format, const void *data) override
virtual ~VKTexture() override
void generate_mipmap() override
eGPUTextureFormat device_format_get() const
bool init_internal() override
void update_sub(int mip, int offset[3], int extent[3], eGPUDataFormat format, const void *data, VKPixelBuffer *pixel_buffer)
VkImage vk_image_handle() const
const VKImageView & image_view_get(const VKImageViewInfo &info)
void swizzle_set(const char swizzle_mask[4]) override
VKTexture(const char *name)
void mip_range_set(int min, int max) override
void read_sub(int mip, eGPUDataFormat format, const int region[6], IndexRange layers, void *r_data)
void * read(int mip, eGPUDataFormat format) override
VKCopyImageCreateInfo CreateInfo
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
void * MEM_mallocN(size_t len, const char *str)
void object_label(GLenum type, GLuint object, const char *name)
static Context * unwrap(GPUContext *ctx)
void convert_host_to_device(void *dst_buffer, const void *src_buffer, size_t buffer_size, eGPUDataFormat host_format, eGPUTextureFormat host_texture_format, eGPUTextureFormat device_format)
size_t to_block_size(eGPUTextureFormat data_type)
static VkImageAspectFlags to_vk_image_aspect_single_bit(const VkImageAspectFlags format, bool stencil)
void convert_device_to_host(void *dst_buffer, const void *src_buffer, size_t buffer_size, eGPUDataFormat host_format, eGPUTextureFormat host_texture_format, eGPUTextureFormat device_format)
VkImageType to_vk_image_type(const eGPUTextureType type)
int to_bytesize(const DataFormat format)
VkFormat to_vk_format(const eGPUTextureFormat format)
VkClearColorValue to_vk_clear_color_value(const eGPUDataFormat format, const void *data)
static VkImageCreateFlags to_vk_image_create(const eGPUTextureType texture_type, const eGPUTextureFormatFlag format_flag, const eGPUTextureUsage usage)
VkImageAspectFlags to_vk_image_aspect_flag_bits(const eGPUTextureFormat format)
static float memory_priority(const eGPUTextureUsage texture_usage)
static VkImageUsageFlags to_vk_image_usage(const eGPUTextureUsage usage, const eGPUTextureFormatFlag format_flag)
VecBase< int32_t, 3 > int3
bool dynamic_rendering_local_read
VKImageViewArrayed arrayed
bool not_aligned_pixel_formats
VkClearColorValue vk_clear_color_value
VkImageSubresourceRange vk_image_subresource_range
VKClearDepthStencilImageData node_data
VkImageAspectFlags vk_image_aspects
VkImageSubresourceRange vk_image_subresource_range
VkClearDepthStencilValue vk_clear_depth_stencil_value
VKCopyBufferToImageData node_data
VkImageAspectFlags vk_image_aspects
VKCopyImageData node_data
VkImageAspectFlags vk_image_aspect
VKCopyImageToBufferData node_data
VkImageAspectFlags vk_image_aspects
VkImageAspectFlags vk_image_aspect