summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/FramebufferManager.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2016-09-11 16:37:41 +1000
committerStenzek <stenzek@gmail.com>2016-10-01 02:40:02 +1000
commitf6cdc38c8b05e1980c42e6a8fa2d8207feb9604d (patch)
tree7cb2513ffa335ef3a9274154dfd40c351a862fdd /Source/Core/VideoBackends/Vulkan/FramebufferManager.cpp
parentc290398320a621c97ec693775e51255ac9b50c15 (diff)
Vulkan: Use render-pass based clears where possible
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/FramebufferManager.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/FramebufferManager.cpp27
1 files changed, 19 insertions, 8 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/FramebufferManager.cpp b/Source/Core/VideoBackends/Vulkan/FramebufferManager.cpp
index 489443f9b7..97de14849b 100644
--- a/Source/Core/VideoBackends/Vulkan/FramebufferManager.cpp
+++ b/Source/Core/VideoBackends/Vulkan/FramebufferManager.cpp
@@ -137,9 +137,19 @@ bool FramebufferManager::CreateEFBRenderPass()
0,
nullptr};
- VkResult res =
- vkCreateRenderPass(g_vulkan_context->GetDevice(), &pass_info, nullptr, &m_efb_render_pass);
+ VkResult res = vkCreateRenderPass(g_vulkan_context->GetDevice(), &pass_info, nullptr,
+ &m_efb_load_render_pass);
+ if (res != VK_SUCCESS)
+ {
+ LOG_VULKAN_ERROR(res, "vkCreateRenderPass (EFB) failed: ");
+ return false;
+ }
+ // render pass for clearing color/depth on load, as opposed to loading it
+ attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ res = vkCreateRenderPass(g_vulkan_context->GetDevice(), &pass_info, nullptr,
+ &m_efb_clear_render_pass);
if (res != VK_SUCCESS)
{
LOG_VULKAN_ERROR(res, "vkCreateRenderPass (EFB) failed: ");
@@ -189,10 +199,10 @@ bool FramebufferManager::CreateEFBRenderPass()
void FramebufferManager::DestroyEFBRenderPass()
{
- if (m_efb_render_pass != VK_NULL_HANDLE)
+ if (m_efb_load_render_pass != VK_NULL_HANDLE)
{
- vkDestroyRenderPass(g_vulkan_context->GetDevice(), m_efb_render_pass, nullptr);
- m_efb_render_pass = VK_NULL_HANDLE;
+ vkDestroyRenderPass(g_vulkan_context->GetDevice(), m_efb_load_render_pass, nullptr);
+ m_efb_load_render_pass = VK_NULL_HANDLE;
}
if (m_depth_resolve_render_pass != VK_NULL_HANDLE)
@@ -280,7 +290,7 @@ bool FramebufferManager::CreateEFBFramebuffer()
VkFramebufferCreateInfo framebuffer_info = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
nullptr,
0,
- m_efb_render_pass,
+ m_efb_load_render_pass,
static_cast<u32>(ArraySize(framebuffer_attachments)),
framebuffer_attachments,
m_efb_width,
@@ -398,7 +408,7 @@ void FramebufferManager::ReinterpretPixelData(int convtype)
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
UtilityShaderDraw draw(g_command_buffer_mgr->GetCurrentCommandBuffer(),
- g_object_cache->GetStandardPipelineLayout(), m_efb_render_pass,
+ g_object_cache->GetStandardPipelineLayout(), m_efb_load_render_pass,
g_object_cache->GetScreenQuadVertexShader(),
g_object_cache->GetScreenQuadGeometryShader(), pixel_shader);
@@ -1136,7 +1146,7 @@ void FramebufferManager::DrawPokeVertices(StateTracker* state_tracker,
pipeline_info.vs = m_poke_vertex_shader;
pipeline_info.gs = (m_efb_layers > 1) ? m_poke_geometry_shader : VK_NULL_HANDLE;
pipeline_info.ps = m_poke_fragment_shader;
- pipeline_info.render_pass = m_efb_render_pass;
+ pipeline_info.render_pass = m_efb_load_render_pass;
pipeline_info.rasterization_state.bits = Util::GetNoCullRasterizationState().bits;
pipeline_info.depth_stencil_state.bits = Util::GetNoDepthTestingDepthStencilState().bits;
pipeline_info.blend_state.bits = Util::GetNoBlendingBlendState().bits;
@@ -1184,6 +1194,7 @@ void FramebufferManager::DrawPokeVertices(StateTracker* state_tracker,
m_poke_vertex_stream_buffer->CommitMemory(vertices_size);
// Set up state.
+ state_tracker->EndClearRenderPass();
state_tracker->BeginRenderPass();
state_tracker->SetPendingRebind();
Util::SetViewportAndScissor(command_buffer, 0, 0, m_efb_width, m_efb_height);