diff --git a/src/engine/renderer/tr_backend.c b/src/engine/renderer/tr_backend.c index 687e141..7c8b63d 100644 --- a/src/engine/renderer/tr_backend.c +++ b/src/engine/renderer/tr_backend.c @@ -375,16 +375,14 @@ A player has predicted a teleport, but hasn't arrived yet ================ */ static void RB_Hyperspace( void ) { - float c; - - if ( !backEnd.isHyperspace ) { - // do initialization shit - } - - c = ( backEnd.refdef.time & 255 ) / 255.0f; + float c = ( backEnd.refdef.time & 255 ) / 255.0f; qglClearColor( c, c, c, 1 ); qglClear( GL_COLOR_BUFFER_BIT ); + // VULKAN + float color[4] = { c, c, c, 1 }; + vk_clear_attachments(false, true, color); + backEnd.isHyperspace = qtrue; } @@ -410,8 +408,6 @@ to actually render the visible surfaces for this view ================= */ void RB_BeginDrawingView (void) { - int clearBits = 0; - // we will need to change the projection matrix before drawing // 2D images again backEnd.projection2D = qfalse; @@ -424,7 +420,7 @@ void RB_BeginDrawingView (void) { // ensures that depth writes are enabled for the depth clear GL_State( GLS_DEFAULT ); // clear relevant buffers - clearBits = GL_DEPTH_BUFFER_BIT; + int clearBits = GL_DEPTH_BUFFER_BIT; bool clear_stencil = (r_shadows->integer == 2); if ( clear_stencil ) @@ -441,8 +437,8 @@ void RB_BeginDrawingView (void) { qglClear( clearBits ); - // VULKAN - vk_clear_attachments(clear_stencil, fast_sky); + // VULKAN + vk_clear_attachments(vk_resources.dirty_attachments, fast_sky, fast_sky_color); if ( ( backEnd.refdef.rdflags & RDF_HYPERSPACE ) ) { diff --git a/src/engine/renderer/vk.cpp b/src/engine/renderer/vk.cpp index 607eeb1..f3e74bb 100644 --- a/src/engine/renderer/vk.cpp +++ b/src/engine/renderer/vk.cpp @@ -1922,28 +1922,33 @@ VkPipeline vk_find_pipeline(const Vk_Pipeline_Def& def) { return pipeline; } -void vk_clear_attachments(bool clear_stencil, bool fast_sky) { +void vk_clear_attachments(bool clear_depth_stencil, bool clear_color, vec4_t color) { if (!vk.active) return; - if (!vk_resources.dirty_attachments && !fast_sky) - return; + if (!clear_depth_stencil && !clear_color) + return; VkClearAttachment attachments[2]; - uint32_t attachment_count = fast_sky ? 2 : 1; + uint32_t attachment_count = 0; - attachments[0].aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; - attachments[0].clearValue.depthStencil.depth = 1.0f; + if (clear_depth_stencil) { + attachments[0].aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + attachments[0].clearValue.depthStencil.depth = 1.0f; - if (clear_stencil) { - attachments[0].aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; - attachments[0].clearValue.depthStencil.stencil = 0; - } - if (fast_sky) { - attachments[1].aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - attachments[1].colorAttachment = 0; - attachments[1].clearValue.color = { fast_sky_color[0], fast_sky_color[1], fast_sky_color[2], fast_sky_color[3] }; - } + if (r_shadows->integer == 2) { + attachments[0].aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + attachments[0].clearValue.depthStencil.stencil = 0; + } + attachment_count = 1; + } + + if (clear_color) { + attachments[attachment_count].aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + attachments[attachment_count].colorAttachment = 0; + attachments[attachment_count].clearValue.color = { color[0], color[1], color[2], color[3] }; + attachment_count++; + } VkClearRect clear_rect[2]; clear_rect[0].rect = vk_get_scissor_rect(); @@ -1955,8 +1960,10 @@ void vk_clear_attachments(bool clear_stencil, bool fast_sky) { // It's a HACK to prevent Vulkan validation layer's performance warning: // "vkCmdClearAttachments() issued on command buffer object XXX prior to any Draw Cmds. // It is recommended you use RenderPass LOAD_OP_CLEAR on Attachments prior to any Draw." - // - if (fast_sky) { + // + // NOTE: we don't use LOAD_OP_CLEAR for color attachment when we begin renderpass + // since at that point we don't know whether we need collor buffer clear (usually we don't). + if (clear_color) { uint32_t h = clear_rect[0].rect.extent.height / 2; clear_rect[0].rect.extent.height = h; clear_rect[1] = clear_rect[0]; diff --git a/src/engine/renderer/vk.h b/src/engine/renderer/vk.h index 5fa00e3..17b9ffd 100644 --- a/src/engine/renderer/vk.h +++ b/src/engine/renderer/vk.h @@ -95,7 +95,7 @@ VkPipeline vk_find_pipeline(const Vk_Pipeline_Def& def); // Rendering setup. // VkRect2D vk_get_scissor_rect(); -void vk_clear_attachments(bool clear_stencil, bool fast_sky); +void vk_clear_attachments(bool clear_depth_stencil, bool clear_color, vec4_t color); void vk_bind_resources_shared_between_stages(); void vk_bind_stage_specific_resources(VkPipeline pipeline, bool multitexture, Vk_Depth_Range depth_range); void vk_begin_frame();