34 case VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT:
35 return (stencil) ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_DEPTH_BIT;
44 if (vk_image_ != VK_NULL_HANDLE && allocation_ != VK_NULL_HANDLE) {
47 vk_image_ = VK_NULL_HANDLE;
48 allocation_ = VK_NULL_HANDLE;
55 current_layout_ = layout;
57 device_format_ = texture_format;
87 context.render_graph.add_node(update_mipmaps);
95 copy_image.
node_data.
region.srcSubresource.aspectMask = vk_image_aspect;
97 copy_image.
node_data.
region.srcSubresource.layerCount = vk_layer_count(1);
98 copy_image.
node_data.
region.dstSubresource.aspectMask = vk_image_aspect;
100 copy_image.
node_data.
region.dstSubresource.layerCount = vk_layer_count(1);
105 context.render_graph.add_node(copy_image);
114 BLI_assert(src->device_format_ == dst->device_format_);
138 context.render_graph.add_node(clear_color_image);
149 vk_image_aspect_device;
150 if (vk_image_aspect == VK_IMAGE_ASPECT_NONE) {
162 VK_REMAINING_ARRAY_LAYERS;
164 VK_REMAINING_MIP_LEVELS;
167 context.render_graph.add_node(clear_depth_stencil_image);
172 memcpy(image_view_info_.
swizzle, swizzle_mask, 4);
184 const int3 extent =
int3(region[3] - region[0], region[4] - region[1], region[5] - region[2]);
185 size_t sample_len = extent.x * extent.y * extent.z * layers.size();
189 size_t device_memory_size = sample_len *
to_bytesize(device_format_);
195 copy_image_to_buffer.
region.imageOffset.x = region[0];
196 copy_image_to_buffer.
region.imageOffset.y = region[1];
197 copy_image_to_buffer.
region.imageOffset.z = region[2];
198 copy_image_to_buffer.
region.imageExtent.width = extent.x;
199 copy_image_to_buffer.
region.imageExtent.height = extent.y;
200 copy_image_to_buffer.
region.imageExtent.depth = extent.z;
203 copy_image_to_buffer.
region.imageSubresource.mipLevel = mip;
204 copy_image_to_buffer.
region.imageSubresource.baseArrayLayer = layers.start();
205 copy_image_to_buffer.
region.imageSubresource.layerCount = layers.size();
208 context.rendering_end();
209 context.render_graph.add_node(copy_image_to_buffer);
210 context.descriptor_set_get().upload_descriptor_sets();
211 context.render_graph.submit_buffer_for_read(staging_buffer.
vk_handle());
221 int mip_size[3] = {1, 1, 1};
224 switch (vk_image_type) {
225 case VK_IMAGE_TYPE_1D: {
229 case VK_IMAGE_TYPE_2D: {
232 case VK_IMAGE_TYPE_3D:
237 if (mip_size[2] == 0) {
241 size_t sample_len = mip_size[0] * mip_size[1] * mip_size[2] * layers.size();
244 void *data =
MEM_mallocN(host_memory_size, __func__);
245 int region[6] = {0, 0, 0, mip_size[0], mip_size[1], mip_size[2]};
258 int3 offset =
int3(offset_[0], offset_[1], offset_[2]);
263 start_layer = offset.y;
271 start_layer = offset.z;
278 size_t sample_len = size_t(extent.x) * extent.y * extent.z * layers;
279 size_t device_memory_size = sample_len *
to_bytesize(device_format_);
282 BLI_assert_msg(extent.z == 1,
"Compressed 3D textures are not supported");
286 device_memory_size = blocks_x * blocks_y * block_size;
289 sample_len = device_memory_size /
to_bytesize(device_format_);
300 copy_buffer_to_image.
region.imageExtent.width = extent.x;
301 copy_buffer_to_image.
region.imageExtent.height = extent.y;
302 copy_buffer_to_image.
region.imageExtent.depth = extent.z;
303 copy_buffer_to_image.
region.bufferRowLength =
304 context.state_manager_get().texture_unpack_row_length_get();
305 copy_buffer_to_image.
region.imageOffset.x = offset.x;
306 copy_buffer_to_image.
region.imageOffset.y = offset.y;
307 copy_buffer_to_image.
region.imageOffset.z = offset.z;
310 copy_buffer_to_image.
region.imageSubresource.mipLevel = mip;
311 copy_buffer_to_image.
region.imageSubresource.baseArrayLayer = start_layer;
312 copy_buffer_to_image.
region.imageSubresource.layerCount = layers;
314 context.render_graph.add_node(copy_buffer_to_image);
320 GPUPixelBuffer *pixbuf)
365 source_buffer_ =
unwrap(vbo);
376 device_format_ = texture->device_format_;
379 layer_offset_ = layer_offset;
380 use_stencil_ = use_stencil;
385bool VKTexture::is_texture_view()
const
387 return source_texture_ !=
nullptr;
393 VkImageUsageFlags result = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
394 VK_IMAGE_USAGE_SAMPLED_BIT;
396 result |= VK_IMAGE_USAGE_STORAGE_BIT;
399 result |= VK_IMAGE_USAGE_STORAGE_BIT;
408 result |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
411 result |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
416 result |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
422 result &= ~VK_IMAGE_USAGE_STORAGE_BIT;
426 result &= ~VK_IMAGE_USAGE_STORAGE_BIT;
436 VkImageCreateFlags result = 0;
439 result |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
444 result |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
450bool VKTexture::allocate()
455 VkExtent3D vk_extent = vk_extent_3d(0);
458 if (vk_extent.depth > limit || vk_extent.height > limit || vk_extent.depth > limit) {
463 VkImageCreateInfo image_info = {};
464 image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
467 image_info.extent = vk_extent;
469 image_info.arrayLayers = vk_layer_count(1);
476 image_info.tiling = VK_IMAGE_TILING_OPTIMAL;
477 image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
479 image_info.samples = VK_SAMPLE_COUNT_1_BIT;
483 VkImageFormatProperties image_format = {};
484 result = vkGetPhysicalDeviceImageFormatProperties(device.physical_device_get(),
486 image_info.imageType,
491 if (result != VK_SUCCESS) {
492 printf(
"Image type not supported on device.\n");
497 VmaAllocationCreateInfo allocCreateInfo = {};
498 allocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;
499 allocCreateInfo.priority = 1.0f;
500 result = vmaCreateImage(device.mem_allocator_get(),
506 if (result != VK_SUCCESS) {
511 device.resources.add_image(vk_image_,
512 image_info.arrayLayers,
513 VK_IMAGE_LAYOUT_UNDEFINED,
517 return result == VK_SUCCESS;
524IndexRange VKTexture::mip_map_range()
const
529IndexRange VKTexture::layer_range()
const
531 if (is_texture_view()) {
540int VKTexture::vk_layer_count(
int non_layered_value)
const
542 if (is_texture_view()) {
550VkExtent3D VKTexture::vk_extent_3d(
int mip_level)
const
552 int extent[3] = {1, 1, 1};
568 if (is_texture_view()) {
573 for (
const VKImageView &image_view : image_views_) {
574 if (image_view.info == info) {
580 return image_views_.last();
585 image_view_info_.
mip_range = mip_map_range();
588 image_view_info_.
arrayed = arrayed;
595 if (is_texture_view()) {
#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_SHADER_READ
@ GPU_TEXTURE_USAGE_SHADER_WRITE
@ GPU_TEXTURE_USAGE_HOST_READ
@ GPU_TEXTURE_USAGE_ATTACHMENT
constexpr int64_t size() const
constexpr int64_t start() const
constexpr IndexRange slice(int64_t start, int64_t size) 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
bool create(size_t size, GPUUsageType usage, VkBufferUsageFlags buffer_usage, bool is_host_visible=true)
VkBuffer vk_handle() const
void * mapped_memory_get() const
VKDiscardPool & discard_pool_for_current_thread()
const VKWorkarounds & workarounds_get() const
void discard_image(VkImage vk_image, VmaAllocation vma_allocation)
void init(VkImage vk_image, VkImageLayout layout, eGPUTextureFormat texture_format)
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) override
VkImage vk_image_handle() const
const VKImageView & image_view_get(const VKImageViewInfo &info)
void swizzle_set(const char swizzle_mask[4]) override
void clear_depth_stencil(const eGPUFrameBufferBits buffer, float clear_depth, uint clear_stencil)
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
additional_info("compositor_sum_float_shared") .push_constant(Type additional_info("compositor_sum_float_shared") .push_constant(Type GPU_RGBA32F
local_group_size(16, 16) .push_constant(Type texture
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)
size_t to_bytesize(GPUIndexBufType type)
VkImageType to_vk_image_type(const eGPUTextureType type)
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 VkImageUsageFlags to_vk_image_usage(const eGPUTextureUsage usage, const eGPUTextureFormatFlag format_flag)
VecBase< int32_t, 3 > int3
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
VKCopyImageData node_data
VkImageAspectFlags vk_image_aspect
VkImageAspectFlags vk_image_aspect