37 enabled_srgb_ =
false;
43 if (context.active_framebuffer_get() ==
this) {
44 context.deactivate_framebuffer();
58 if (context.has_active_framebuffer()) {
59 context.deactivate_framebuffer();
62 context.activate_framebuffer(*
this);
63 enabled_srgb_ = enabled_srgb;
76 for (VkViewport &viewport : viewports) {
81 viewport.minDepth = 0.0f;
82 viewport.maxDepth = 1.0f;
92 for (VkRect2D &render_area : render_areas) {
98 render_area.extent.width =
clamp_i(scissor_rect[2], 1,
width_ - scissor_rect[0]);
99 render_area.extent.height =
clamp_i(scissor_rect[3], 1,
height_ - scissor_rect[1]);
102 render_area.offset.x = 0;
103 render_area.offset.y = 0;
104 render_area.extent.width =
width_;
105 render_area.extent.height =
height_;
116void VKFrameBuffer::build_clear_attachments_depth_stencil(
133void VKFrameBuffer::build_clear_attachments_color(
134 const float (*clear_colors)[4],
135 const bool multi_clear_colors,
141 if (attachment.
tex ==
nullptr) {
145 clear_attachments.attachments[clear_attachments.attachment_count++];
150 &clear_colors[color_index]);
152 color_index += multi_clear_colors ? 1 : 0;
164 context.render_graph.add_node(clear_attachments);
168 const float clear_color[4],
174 clear_attachments.vk_clear_rect.baseArrayLayer = 0;
175 clear_attachments.vk_clear_rect.layerCount = 1;
192 if ((context.state_manager_get().state.write_mask & needed_mask) == needed_mask &&
195 build_clear_attachments_depth_stencil(
196 buffers, clear_depth, clear_stencil, clear_attachments);
200 if (depth_texture !=
nullptr) {
206 float clear_color_single[4];
208 build_clear_attachments_color(&clear_color_single,
false, clear_attachments);
211 if (clear_attachments.attachment_count) {
212 clear(clear_attachments);
220 clear_attachments.vk_clear_rect.baseArrayLayer = 0;
221 clear_attachments.vk_clear_rect.layerCount = 1;
223 build_clear_attachments_color(clear_color,
true, clear_attachments);
224 if (clear_attachments.attachment_count) {
225 clear(clear_attachments);
247 load_stores[type] = ls;
254 return VK_ATTACHMENT_LOAD_OP_DONT_CARE;
256 return VK_ATTACHMENT_LOAD_OP_CLEAR;
258 return VK_ATTACHMENT_LOAD_OP_LOAD;
261 return VK_ATTACHMENT_LOAD_OP_LOAD;
268 return VK_ATTACHMENT_STORE_OP_DONT_CARE;
270 return VK_ATTACHMENT_STORE_OP_STORE;
273 return VK_ATTACHMENT_STORE_OP_STORE;
310 .copy_from(color_attachment_states);
315 context.state_manager_get().texture_bind(
354 "Trying to read back texture from framebuffer, but no texture is available in "
356 if (texture ==
nullptr) {
359 const int region[6] = {area[0], area[1], 0, area[0] + area[2], area[1] + area[3], 1};
361 texture->read_sub(0,
format, region, layers, r_data);
375 VkImageAspectFlags image_aspect)
379 if (dst_offset_x == 0 && dst_offset_y == 0 &&
384 src_texture.
copy_to(dst_texture, image_aspect);
392 blit_image.
filter = VK_FILTER_NEAREST;
394 VkImageBlit ®ion = blit_image.
region;
395 region.srcSubresource.aspectMask = image_aspect;
396 region.srcSubresource.mipLevel = 0;
397 region.srcSubresource.baseArrayLayer = 0;
398 region.srcSubresource.layerCount = 1;
399 region.srcOffsets[0].x = 0;
400 region.srcOffsets[0].y = 0;
401 region.srcOffsets[0].z = 0;
402 region.srcOffsets[1].x = src_texture.
width_get();
403 region.srcOffsets[1].y = src_texture.
height_get();
404 region.srcOffsets[1].z = 1;
406 region.dstSubresource.aspectMask = image_aspect;
407 region.dstSubresource.mipLevel = 0;
408 region.dstSubresource.baseArrayLayer = 0;
409 region.dstSubresource.layerCount = 1;
410 region.dstOffsets[0].x =
min_ii(dst_offset_x, dst_texture.
width_get());
412 region.dstOffsets[0].z = 0;
416 region.dstOffsets[1].z = 1;
418 context.render_graph.add_node(blit_image);
430 "VKFrameBuffer::blit_to only supports a single color or depth aspect.");
434 if (!context.has_active_framebuffer()) {
444 if (src_attachment.
tex && dst_attachment.
tex) {
452 VK_IMAGE_ASPECT_COLOR_BIT);
465 if (src_attachment.
tex && dst_attachment.
tex) {
473 VK_IMAGE_ASPECT_DEPTH_BIT);
492 if (attachment.
tex) {
517 size =
max_ii(color_slot + 1, size);
527 is_rendering_ =
false;
536 is_rendering_ =
true;
539 depth_attachment_format_ = VK_FORMAT_UNDEFINED;
540 stencil_attachment_format_ = VK_FORMAT_UNDEFINED;
548 color_attachment_formats_.
clear();
549 for (
int color_attachment_index :
553 if (attachment.
tex ==
nullptr) {
561 if (attachment.
layer == -1 && layer_count != 1) {
566 VkRenderingAttachmentInfo &attachment_info =
569 attachment_info.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
571 VkImageView vk_image_view = VK_NULL_HANDLE;
578 layer_count != 1 ?
max_ii(layer_count - layer_base, 1) : layer_count),
580 {{
'r',
'g',
'b',
'a'}},
582 srgb_ && enabled_srgb_,
586 attachment_info.imageView = vk_image_view;
587 attachment_info.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
588 set_load_store(attachment_info, load_stores[color_attachment_index]);
590 access_info.
images.append(
592 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
593 VK_IMAGE_ASPECT_COLOR_BIT,
595 color_attachment_formats_.
append(
597 VK_FORMAT_UNDEFINED :
607 if (attachment.
tex ==
nullptr) {
614 VK_IMAGE_ASPECT_STENCIL_BIT;
615 VkImageLayout vk_image_layout = is_depth_stencil_attachment ?
616 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL :
617 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL;
619 VkImageView depth_image_view = VK_NULL_HANDLE;
624 {{
'r',
'g',
'b',
'a'}},
625 is_stencil_attachment,
631 depth_image_view == VK_NULL_HANDLE) ?
632 VK_FORMAT_UNDEFINED :
640 attachment_info.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
641 attachment_info.imageView = depth_image_view;
642 attachment_info.imageLayout = vk_image_layout;
644 set_load_store(attachment_info, load_stores[depth_attachment_index]);
645 depth_attachment_format_ = vk_format;
650 if (is_stencil_attachment) {
652 attachment_info.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO;
653 attachment_info.imageView = depth_image_view;
654 attachment_info.imageLayout = vk_image_layout;
656 set_load_store(attachment_info, load_stores[depth_attachment_index]);
657 stencil_attachment_format_ = vk_format;
663 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
664 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
665 is_stencil_attachment ?
666 static_cast<VkImageAspectFlags
>(VK_IMAGE_ASPECT_DEPTH_BIT |
667 VK_IMAGE_ASPECT_STENCIL_BIT) :
668 static_cast<VkImageAspectFlags
>(VK_IMAGE_ASPECT_DEPTH_BIT),
673 context.render_graph.add_node(begin_rendering);
678 return depth_attachment_format_;
682 return stencil_attachment_format_;
686 return color_attachment_formats_;
697 context.render_graph.add_node(end_rendering);
698 is_rendering_ =
false;
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
MINLINE int min_ii(int a, int b)
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
#define GPU_MAX_VIEWPORTS
void GPU_texture_get_mipmap_size(GPUTexture *texture, int mip_level, int *r_size)
eGPUTextureFormat GPU_texture_format(const GPUTexture *texture)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
MutableSpan< T > as_mutable_span()
void fill(const T &value) const
constexpr int64_t size() const
void append(const T &value)
void size_set(int width, int height)
GPUTexture * depth_tex() const
bool use_explicit_load_store_
bool scissor_test_get() const
void scissor_get(int r_scissor[4]) const
GPUTexture * color_tex(int slot) const
GPUAttachment attachments_[GPU_FB_MAX_ATTACHMENT]
int viewport_[GPU_MAX_VIEWPORTS][4]
static void set_framebuffer_srgb_target(int use_srgb_to_linear)
const VKWorkarounds & workarounds_get() const
void rendering_ensure(VKContext &context)
VKFrameBuffer(const char *name)
void clear_multi(const float(*clear_color)[4]) override
VkFormat stencil_attachment_format_get() const
void read(eGPUFrameBufferBits planes, eGPUDataFormat format, const int area[4], int channel_len, int slot, void *r_data) override
void subpass_transition_impl(const GPUAttachmentState depth_attachment_state, Span< GPUAttachmentState > color_attachment_states) override
void clear(eGPUFrameBufferBits buffers, const float clear_color[4], float clear_depth, uint clear_stencil) override
void bind(bool enabled_srgb) override
VkFormat depth_attachment_format_get() const
Array< VkViewport, 16 > vk_viewports_get() const
void rendering_end(VKContext &context)
bool check(char err_out[256]) override
void attachment_set_loadstore_op(GPUAttachmentType type, GPULoadStore) override
void blit_to(eGPUFrameBufferBits planes, int src_slot, FrameBuffer *dst, int dst_slot, int dst_offset_x, int dst_offset_y) override
int color_attachments_resource_size() const
void clear_attachment(GPUAttachmentType type, eGPUDataFormat data_format, const void *clear_value) override
Array< VkRect2D, 16 > vk_render_areas_get() const
Span< VkFormat > color_attachment_formats_get() const
VkImageView vk_handle() const
void copy_to(Texture *tex) override
eGPUTextureFormat device_format_get() const
VkImage vk_image_handle() const
const VKImageView & image_view_get(const VKImageViewInfo &info)
void clear_depth_stencil(const eGPUFrameBufferBits buffer, float clear_depth, uint clear_stencil)
VKClearAttachmentsData CreateInfo
@ GPU_FB_DEPTH_STENCIL_ATTACHMENT
@ GPU_FB_COLOR_ATTACHMENT0
@ GPU_FB_DEPTH_ATTACHMENT
#define GPU_FB_MAX_COLOR_ATTACHMENT
constexpr GPULoadStore default_load_store()
static Context * unwrap(GPUContext *ctx)
static VkAttachmentStoreOp to_vk_attachment_store_op(eGPUStoreOp store_op)
static void set_load_store(VkRenderingAttachmentInfo &r_rendering_attachment, const GPULoadStore &ls)
static VkAttachmentLoadOp to_vk_attachment_load_op(eGPULoadOp load_op)
VkFormat to_vk_format(const eGPUTextureFormat format)
VkClearColorValue to_vk_clear_color_value(const eGPUDataFormat format, const void *data)
VkImageAspectFlags to_vk_image_aspect_flag_bits(const eGPUTextureFormat format)
eGPUDataFormat to_data_format(eGPUTextureFormat tex_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 constexpr GPUSamplerState default_sampler()
bool dynamic_rendering_unused_attachments
VKBeginRenderingData node_data
VkRenderingAttachmentInfo stencil_attachment
VkRenderingAttachmentInfo color_attachments[8]
VkRenderingAttachmentInfo depth_attachment
VkRenderingInfoKHR vk_rendering_info
uint32_t attachment_count
VkClearAttachment attachments[8]
VkClearRect vk_clear_rect
Vector< VKImageAccess > images