Blender V5.0
vk_texture.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
12
13#include "vk_context.hh"
14#include "vk_image_view.hh"
15#include "vk_memory.hh"
16
17namespace blender::gpu {
18
19class VKSampler;
21class VKVertexBuffer;
22class VKPixelBuffer;
23
25enum class VKImageViewFlags {
27 NO_SWIZZLING = 1 << 0,
28};
30
31class VKTexture : public Texture {
33 friend class VKContext;
34
42
44 VKTexture *source_texture_ = nullptr;
45
53 VKVertexBuffer *source_buffer_ = nullptr;
54 VkImage vk_image_ = VK_NULL_HANDLE;
55 VmaAllocation allocation_ = VK_NULL_HANDLE;
56 VmaAllocationInfo allocation_info_ = {};
57
62 Vector<VKImageView> image_views_;
63
64 int layer_offset_ = 0;
65 bool use_stencil_ = false;
66
67 char swizzle_[4] = {'r', 'g', 'b', 'a'};
68 VKImageViewInfo image_view_info_ = {eImageViewUsage::ShaderBinding,
69 IndexRange(0, VK_REMAINING_ARRAY_LAYERS),
70 IndexRange(0, VK_REMAINING_MIP_LEVELS),
71 {{'r', 'g', 'b', 'a'}},
72 false,
73 false,
75
76 public:
77 VKTexture(const char *name) : Texture(name) {}
78
79 virtual ~VKTexture() override;
80
81 void generate_mipmap() override;
82 void copy_to(Texture *tex) override;
83 void copy_to(VKTexture &dst_texture, VkImageAspectFlags vk_image_aspect);
84 void clear(eGPUDataFormat format, const void *data) override;
85 void clear_depth_stencil(const GPUFrameBufferBits buffer,
86 float clear_depth,
87 uint clear_stencil,
88 std::optional<int> layer);
89 void swizzle_set(const char swizzle_mask[4]) override;
90 void mip_range_set(int min, int max) override;
91 void *read(int mip, eGPUDataFormat format) override;
92 void read_sub(
93 int mip, eGPUDataFormat format, const int region[6], IndexRange layers, void *r_data);
94 void update_sub(int mip,
95 int offset[3],
96 int extent[3],
98 const void *data,
99 VKPixelBuffer *pixel_buffer);
100
101 void update_sub(
102 int mip, int offset[3], int extent[3], eGPUDataFormat format, const void *data) override;
103 void update_sub(int offset[3],
104 int extent[3],
106 GPUPixelBuffer *pixbuf) override;
107
114 VKMemoryExport export_memory(VkExternalMemoryHandleTypeFlagBits handle_type);
115
116 VkImage vk_image_handle() const
117 {
118 if (is_texture_view()) {
119 return source_texture_->vk_image_handle();
120 }
121 BLI_assert(vk_image_ != VK_NULL_HANDLE);
122 return vk_image_;
123 }
124
129 {
130 return device_format_;
131 }
132
137 const VKImageView &image_view_get(const VKImageViewInfo &info);
138
142 const VKImageView &image_view_get(VKImageViewArrayed arrayed, VKImageViewFlags flags);
143
144 protected:
145 bool init_internal() override;
146 bool init_internal(VertBuf *vbo) override;
147 bool init_internal(gpu::Texture *src,
148 int mip_offset,
149 int layer_offset,
150 bool use_stencil) override;
151 /* Initialize VKTexture with a swapchain image. */
152 void init_swapchain(VkImage vk_image, TextureFormat gpu_format);
153
154 private:
156 bool is_texture_view() const;
157
162 bool allocate();
163
168 int vk_layer_count(int non_layered_value) const;
169
173 VkExtent3D vk_extent_3d(int mip_level) const;
174
175 /* -------------------------------------------------------------------- */
178
179 private:
180 IndexRange mip_map_range() const;
181 IndexRange layer_range() const;
182
184};
185
187{
188 return static_cast<VKTexture *>(tex);
189}
190
192{
193 return static_cast<Texture *>(texture);
194}
195
196} // namespace blender::gpu
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_INLINE
unsigned int uint
#define ENUM_OPERATORS(_type, _max)
GPUFrameBufferBits
eGPUDataFormat
BMesh const char void * data
Texture(const char *name)
friend class VKDescriptorSetUpdator
Definition vk_texture.hh:32
TextureFormat device_format_get() const
VkImage vk_image_handle() const
VKTexture(const char *name)
Definition vk_texture.hh:77
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
format
static void clear(Message &msg)
Definition msgfmt.cc:213
static Context * unwrap(GPUContext *ctx)
static GPUContext * wrap(Context *ctx)
const char * name
#define min(a, b)
Definition sort.cc:36
max
Definition text_draw.cc:251