36 enabled_srgb_ =
false;
42 if (context && context->active_framebuffer_get() ==
this) {
43 context->deactivate_framebuffer();
57 if (context.has_active_framebuffer()) {
58 context.deactivate_framebuffer();
61 context.activate_framebuffer(*
this);
66 enabled_srgb_ = enabled_srgb;
81 viewport.minDepth = 0.0f;
82 viewport.maxDepth = 1.0f;
83 r_viewports.
append(viewport);
94 render_area.extent.width =
clamp_i(scissor_rect[2], 1,
width_ - scissor_rect[0]);
95 render_area.extent.height =
clamp_i(scissor_rect[3], 1,
height_ - scissor_rect[1]);
98 render_area.offset.x = 0;
99 render_area.offset.y = 0;
100 render_area.extent.width =
width_;
101 render_area.extent.height =
height_;
106 BLI_assert(render_area.offset.x + render_area.extent.width <=
108 BLI_assert(render_area.offset.y + render_area.extent.height <=
116 VkRect2D render_area;
126void VKFrameBuffer::build_clear_attachments_depth_stencil(
129 uint32_t clear_stencil,
143void VKFrameBuffer::build_clear_attachments_color(
144 const float (*clear_colors)[4],
145 const bool multi_clear_colors,
151 if (attachment.
tex ==
nullptr) {
155 clear_attachments.attachments[clear_attachments.attachment_count++];
160 &clear_colors[color_index]);
162 color_index += multi_clear_colors ? 1 : 0;
174 context.render_graph().add_node(clear_attachments);
178 const float clear_color[4],
184 clear_attachments.vk_clear_rect.baseArrayLayer = 0;
185 clear_attachments.vk_clear_rect.layerCount = 1;
202 if ((context.state_manager_get().state.write_mask & needed_mask) == needed_mask &&
205 build_clear_attachments_depth_stencil(
206 buffers, clear_depth, clear_stencil, clear_attachments);
211 if (depth_texture !=
nullptr) {
216 attachment.
layer == -1 ? std::nullopt : std::make_optional(attachment.
layer));
221 float clear_color_single[4];
223 build_clear_attachments_color(&clear_color_single,
false, clear_attachments);
226 if (clear_attachments.attachment_count) {
227 clear(clear_attachments);
235 clear_attachments.vk_clear_rect.baseArrayLayer = 0;
236 clear_attachments.vk_clear_rect.layerCount = 1;
238 build_clear_attachments_color(clear_color,
true, clear_attachments);
239 if (clear_attachments.attachment_count) {
240 clear(clear_attachments);
262 load_stores[type] = ls;
269 return VK_ATTACHMENT_LOAD_OP_DONT_CARE;
271 return VK_ATTACHMENT_LOAD_OP_CLEAR;
273 return VK_ATTACHMENT_LOAD_OP_LOAD;
276 return VK_ATTACHMENT_LOAD_OP_LOAD;
283 return VK_ATTACHMENT_STORE_OP_DONT_CARE;
285 return VK_ATTACHMENT_STORE_OP_STORE;
288 return VK_ATTACHMENT_STORE_OP_STORE;
312 attachment_states_.as_mutable_span()
314 .copy_from(color_attachment_states);
316 if (supports_local_read) {
323 context.state_manager_get().image_bind(
texture, index);
328 is_rendering_ =
false;
348 context.state_manager_get().texture_bind(
388 "Trying to read back texture from framebuffer, but no texture is available in "
393 const int region[6] = {area[0], area[1], 0, area[0] + area[2], area[1] + area[3], 1};
409 VkImageAspectFlags image_aspect)
413 if (dst_offset_x == 0 && dst_offset_y == 0 &&
418 src_texture.
copy_to(dst_texture, image_aspect);
426 blit_image.
filter = VK_FILTER_NEAREST;
428 VkImageBlit ®ion = blit_image.
region;
429 region.srcSubresource.aspectMask = image_aspect;
430 region.srcSubresource.mipLevel = 0;
431 region.srcSubresource.baseArrayLayer = 0;
432 region.srcSubresource.layerCount = 1;
433 region.srcOffsets[0].x = 0;
434 region.srcOffsets[0].y = 0;
435 region.srcOffsets[0].z = 0;
436 region.srcOffsets[1].x = src_texture.
width_get();
437 region.srcOffsets[1].y = src_texture.
height_get();
438 region.srcOffsets[1].z = 1;
440 region.dstSubresource.aspectMask = image_aspect;
441 region.dstSubresource.mipLevel = 0;
442 region.dstSubresource.baseArrayLayer = 0;
443 region.dstSubresource.layerCount = 1;
446 region.dstOffsets[0].z = 0;
447 region.dstOffsets[1].x =
clamp_i(
449 region.dstOffsets[1].y =
clamp_i(
451 region.dstOffsets[1].z = 1;
453 context.render_graph().add_node(blit_image);
465 "VKFrameBuffer::blit_to only supports a single color or depth aspect.");
469 if (!context.has_active_framebuffer()) {
479 if (src_attachment.
tex && dst_attachment.
tex) {
487 VK_IMAGE_ASPECT_COLOR_BIT);
500 if (src_attachment.
tex && dst_attachment.
tex) {
508 VK_IMAGE_ASPECT_DEPTH_BIT);
527 if (attachment.
tex) {
562 is_rendering_ =
false;
571 depth_attachment_format_ = VK_FORMAT_UNDEFINED;
572 stencil_attachment_format_ = VK_FORMAT_UNDEFINED;
580 color_attachment_formats_.clear();
581 int32_t max_filled_slot_index = -1;
582 for (
int color_attachment_index :
586 if (attachment.
tex ==
nullptr) {
587 color_attachment_formats_.append(VK_FORMAT_UNDEFINED);
588 VkRenderingAttachmentInfo &attachment_info =
590 .colorAttachmentCount++];
591 attachment_info = {VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
594 VK_IMAGE_LAYOUT_UNDEFINED,
595 VK_RESOLVE_MODE_NONE,
597 VK_IMAGE_LAYOUT_UNDEFINED,
598 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
599 VK_ATTACHMENT_STORE_OP_DONT_CARE};
606 "Texture is used as an attachment, but doesn't have the "
607 "GPU_TEXTURE_USAGE_ATTACHMENT flag.");
612 if (attachment.
layer == -1 && layer_count != 1) {
617 VkRenderingAttachmentInfo &attachment_info =
620 attachment_info.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
622 VkImageView vk_image_view = VK_NULL_HANDLE;
630 layer_count != 1 ?
max_ii(layer_count - layer_base, 1) : layer_count),
632 {{
'r',
'g',
'b',
'a'}},
634 srgb_ && enabled_srgb_,
640 attachment_info.imageView = vk_image_view;
641 attachment_info.imageLayout = supports_local_read ? VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR :
642 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
643 set_load_store(attachment_info, load_stores[color_attachment_index]);
645 access_info.
images.append(
647 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
648 VK_IMAGE_ASPECT_COLOR_BIT,
649 {0, VK_REMAINING_MIP_LEVELS, layer_base, VK_REMAINING_ARRAY_LAYERS}});
650 color_attachment_formats_.append(
652 VK_FORMAT_UNDEFINED :
663 if (attachment.
tex ==
nullptr) {
669 "Texture is used as an attachment, but doesn't have the "
670 "GPU_TEXTURE_USAGE_ATTACHMENT flag.");
673 VK_IMAGE_ASPECT_STENCIL_BIT;
674 VkImageLayout vk_image_layout = is_depth_stencil_attachment ?
675 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL :
676 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
678 VkImageView depth_image_view = VK_NULL_HANDLE;
683 {{
'r',
'g',
'b',
'a'}},
684 is_stencil_attachment,
690 depth_image_view == VK_NULL_HANDLE) ?
691 VK_FORMAT_UNDEFINED :
699 attachment_info.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
700 attachment_info.imageView = depth_image_view;
701 attachment_info.imageLayout = vk_image_layout;
703 set_load_store(attachment_info, load_stores[depth_attachment_index]);
704 depth_attachment_format_ = vk_format;
709 if (is_stencil_attachment) {
711 attachment_info.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
712 attachment_info.imageView = depth_image_view;
713 attachment_info.imageLayout = vk_image_layout;
715 set_load_store(attachment_info, load_stores[depth_attachment_index]);
716 stencil_attachment_format_ = vk_format;
722 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
723 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
724 is_stencil_attachment ?
725 static_cast<VkImageAspectFlags
>(VK_IMAGE_ASPECT_DEPTH_BIT |
726 VK_IMAGE_ASPECT_STENCIL_BIT) :
727 static_cast<VkImageAspectFlags
>(VK_IMAGE_ASPECT_DEPTH_BIT),
732 context.render_graph().add_node(begin_rendering);
746 is_rendering_ =
true;
754 return depth_attachment_format_;
758 return stencil_attachment_format_;
762 return color_attachment_formats_;
773 context.render_graph().add_node(end_rendering);
774 is_rendering_ =
false;
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
MINLINE int max_ii(int a, int b)
MINLINE int clamp_i(int value, int min, int max)
MINLINE void copy_v4_v4(float r[4], const float a[4])
#define UNUSED_VARS_NDEBUG(...)
@ GPU_LOADACTION_DONT_CARE
@ GPU_STOREACTION_DONT_CARE
static constexpr int GPU_MAX_VIEWPORTS
void GPU_texture_get_mipmap_size(blender::gpu::Texture *texture, int mip_level, int *r_size)
blender::gpu::TextureFormat GPU_texture_format(const blender::gpu::Texture *texture)
@ GPU_TEXTURE_USAGE_ATTACHMENT
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
constexpr int64_t size() const
void append(const T &value)
void append_n_times(const T &value, const int64_t n)
void size_set(int width, int height)
bool use_explicit_load_store_
bool scissor_test_get() const
const GPUAttachment & depth_attachment() const
void scissor_get(int r_scissor[4]) const
blender::gpu::Texture * color_tex(int slot) const
FrameBuffer(const char *name)
GPUAttachment attachments_[GPU_FB_MAX_ATTACHMENT]
int viewport_[GPU_MAX_VIEWPORTS][4]
static void set_framebuffer_srgb_target(int use_srgb_to_linear)
eGPUTextureUsage usage_get() const
const VKExtensions & extensions_get() const
const VkPhysicalDeviceProperties & physical_device_properties_get() const
void rendering_ensure_dynamic_rendering(VKContext &context, const VKExtensions &extensions)
void rendering_ensure(VKContext &context)
VKFrameBuffer(const char *name)
void clear(GPUFrameBufferBits buffers, const float clear_color[4], float clear_depth, uint clear_stencil) override
void clear_multi(const float(*clear_color)[4]) override
void vk_render_areas_append(Vector< VkRect2D > &r_render_areas) const
uint32_t color_attachment_size
VkFormat stencil_attachment_format_get() const
void subpass_transition_impl(const GPUAttachmentState depth_attachment_state, Span< GPUAttachmentState > color_attachment_states) override
void read(GPUFrameBufferBits planes, eGPUDataFormat format, const int area[4], int channel_len, int slot, void *r_data) override
void render_area_update(VkRect2D &render_area) const
void bind(bool enabled_srgb) override
VkFormat depth_attachment_format_get() const
void blit_to(GPUFrameBufferBits planes, int src_slot, FrameBuffer *dst, int dst_slot, int dst_offset_x, int dst_offset_y) override
void rendering_end(VKContext &context)
bool check(char err_out[256]) override
void attachment_set_loadstore_op(GPUAttachmentType type, GPULoadStore) override
int color_attachments_resource_size() const
void clear_attachment(GPUAttachmentType type, eGPUDataFormat data_format, const void *clear_value) override
void vk_viewports_append(Vector< VkViewport > &r_viewports) const
Span< VkFormat > color_attachment_formats_get() const
VkFormat vk_format() const
VkImageView vk_handle() const
void clear_depth_stencil(const GPUFrameBufferBits buffer, float clear_depth, uint clear_stencil, std::optional< int > layer)
void copy_to(Texture *tex) override
TextureFormat device_format_get() const
VkImage vk_image_handle() const
const VKImageView & image_view_get(const VKImageViewInfo &info)
VKClearAttachmentsData CreateInfo
@ GPU_FB_DEPTH_STENCIL_ATTACHMENT
@ GPU_FB_COLOR_ATTACHMENT0
@ GPU_FB_DEPTH_ATTACHMENT
#define GPU_FB_MAX_COLOR_ATTACHMENT
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
int context(const bContext *C, const char *member, bContextDataResult *result)
constexpr GPULoadStore default_load_store()
static VkAttachmentLoadOp to_vk_attachment_load_op(GPULoadOp load_op)
static Context * unwrap(GPUContext *ctx)
VkFormat to_vk_format(const TextureFormat format)
eGPUDataFormat to_texture_data_format(TextureFormat tex_format)
static void set_load_store(VkRenderingAttachmentInfo &r_rendering_attachment, const GPULoadStore &ls)
VkClearColorValue to_vk_clear_color_value(const eGPUDataFormat format, const void *data)
VkImageAspectFlags to_vk_image_aspect_flag_bits(const TextureFormat format)
static void blit_aspect(VKContext &context, VKTexture &dst_texture, VKTexture &src_texture, int dst_offset_x, int dst_offset_y, VkImageAspectFlags image_aspect)
static VkAttachmentStoreOp to_vk_attachment_store_op(GPUStoreOp store_op)
blender::gpu::Texture * tex
static constexpr GPUSamplerState default_sampler()
bool dynamic_rendering_unused_attachments
bool dynamic_rendering_local_read
VKBeginRenderingData node_data
VkRenderingAttachmentInfo stencil_attachment
VkRenderingAttachmentInfo color_attachments[8]
VkRenderingAttachmentInfo depth_attachment
VkRenderingInfoKHR vk_rendering_info
uint32_t attachment_count
VkClearAttachment attachments[8]
Vector< VKImageAccess > images