Blender V4.5
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
33
40 eGPUTextureFormat device_format_ = (eGPUTextureFormat)-1;
41
43 VKTexture *source_texture_ = nullptr;
44
52 VKVertexBuffer *source_buffer_ = nullptr;
53 VkImage vk_image_ = VK_NULL_HANDLE;
54 VmaAllocation allocation_ = VK_NULL_HANDLE;
55 VmaAllocationInfo allocation_info_ = {};
56
61 Vector<VKImageView> image_views_;
62
63 int layer_offset_ = 0;
64 bool use_stencil_ = false;
65
66 char swizzle_[4] = {'r', 'g', 'b', 'a'};
67 VKImageViewInfo image_view_info_ = {eImageViewUsage::ShaderBinding,
68 IndexRange(0, VK_REMAINING_ARRAY_LAYERS),
69 IndexRange(0, VK_REMAINING_MIP_LEVELS),
70 {{'r', 'g', 'b', 'a'}},
71 false,
72 false,
74
75 public:
76 VKTexture(const char *name) : Texture(name) {}
77
78 virtual ~VKTexture() override;
79
80 void generate_mipmap() override;
81 void copy_to(Texture *tex) override;
82 void copy_to(VKTexture &dst_texture, VkImageAspectFlags vk_image_aspect);
83 void clear(eGPUDataFormat format, const void *data) override;
84 void clear_depth_stencil(const eGPUFrameBufferBits buffer,
85 float clear_depth,
86 uint clear_stencil,
87 std::optional<int> layer);
88 void swizzle_set(const char swizzle_mask[4]) override;
89 void mip_range_set(int min, int max) override;
90 void *read(int mip, eGPUDataFormat format) override;
91 void read_sub(
92 int mip, eGPUDataFormat format, const int region[6], IndexRange layers, void *r_data);
93 void update_sub(int mip,
94 int offset[3],
95 int extent[3],
97 const void *data,
98 VKPixelBuffer *pixel_buffer);
99
100 void update_sub(
101 int mip, int offset[3], int extent[3], eGPUDataFormat format, const void *data) override;
102 void update_sub(int offset[3],
103 int extent[3],
105 GPUPixelBuffer *pixbuf) override;
106
107 /* TODO(fclem): Legacy. Should be removed at some point. */
108 uint gl_bindcode_get() const override;
115 VKMemoryExport export_memory(VkExternalMemoryHandleTypeFlagBits handle_type);
116
117 VkImage vk_image_handle() const
118 {
119 if (is_texture_view()) {
120 return source_texture_->vk_image_handle();
121 }
122 BLI_assert(vk_image_ != VK_NULL_HANDLE);
123 return vk_image_;
124 }
125
130 {
131 return device_format_;
132 }
133
138 const VKImageView &image_view_get(const VKImageViewInfo &info);
139
143 const VKImageView &image_view_get(VKImageViewArrayed arrayed, VKImageViewFlags flags);
144
145 protected:
146 bool init_internal() override;
147 bool init_internal(VertBuf *vbo) override;
148 bool init_internal(GPUTexture *src, int mip_offset, int layer_offset, bool use_stencil) override;
149
150 private:
152 bool is_texture_view() const;
153
158 bool allocate();
159
164 int vk_layer_count(int non_layered_value) const;
165
169 VkExtent3D vk_extent_3d(int mip_level) const;
170
171 /* -------------------------------------------------------------------- */
174
175 private:
176 IndexRange mip_map_range() const;
177 IndexRange layer_range() const;
178
180};
181
183{
184 return static_cast<VKTexture *>(tex);
185}
186
188{
189 return static_cast<Texture *>(texture);
190}
191
192} // namespace blender::gpu
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_INLINE
unsigned int uint
#define ENUM_OPERATORS(_type, _max)
eGPUFrameBufferBits
eGPUDataFormat
eGPUTextureFormat
BMesh const char void * data
Texture(const char *name)
eGPUTextureFormat device_format_get() const
friend class VKDescriptorSetUpdator
Definition vk_texture.hh:32
VkImage vk_image_handle() const
VKTexture(const char *name)
Definition vk_texture.hh:76
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
#define class
#define public
format
static void clear(Message &msg)
Definition msgfmt.cc:213
static Context * unwrap(GPUContext *ctx)
static GPUContext * wrap(Context *ctx)
#define min(a, b)
Definition sort.cc:36
read
max
Definition text_draw.cc:251