From 1dcc84a4724e0ee0af1e82ed4706cb250c9c30a5 Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Thu, 18 Feb 2016 18:18:13 -0800 Subject: [PATCH] Starting render passes. --- src/xenia/gpu/vulkan/render_cache.cc | 34 ++++++++++++++++++++++++++++ src/xenia/gpu/vulkan/render_cache.h | 3 +++ 2 files changed, 37 insertions(+) diff --git a/src/xenia/gpu/vulkan/render_cache.cc b/src/xenia/gpu/vulkan/render_cache.cc index de25fb2e3..32d9349e5 100644 --- a/src/xenia/gpu/vulkan/render_cache.cc +++ b/src/xenia/gpu/vulkan/render_cache.cc @@ -37,6 +37,37 @@ VkRenderPass RenderCache::BeginRenderPass(VkCommandBuffer command_buffer, // Lookup or construct a render pass compatible with our current state. VkRenderPass render_pass = nullptr; + // Begin render pass. + VkRenderPassBeginInfo render_pass_begin_info; + render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + render_pass_begin_info.pNext = nullptr; + render_pass_begin_info.renderPass = render_pass; + + // Target framebuffer. + // render_pass_begin_info.framebuffer = current_buffer.framebuffer; + + // Render into the entire buffer (or at least tell the API we are doing + // this). In theory it'd be better to clip this to the scissor region, but + // the docs warn anything but the full framebuffer may be slow. + render_pass_begin_info.renderArea.offset.x = 0; + render_pass_begin_info.renderArea.offset.y = 0; + // render_pass_begin_info.renderArea.extent.width = surface_width_; + // render_pass_begin_info.renderArea.extent.height = surface_height_; + + // Configure clear color, if clearing. + VkClearValue color_clear_value; + color_clear_value.color.float32[0] = 238 / 255.0f; + color_clear_value.color.float32[1] = 238 / 255.0f; + color_clear_value.color.float32[2] = 238 / 255.0f; + color_clear_value.color.float32[3] = 1.0f; + VkClearValue clear_values[] = {color_clear_value}; + render_pass_begin_info.clearValueCount = + static_cast(xe::countof(clear_values)); + render_pass_begin_info.pClearValues = clear_values; + + vkCmdBeginRenderPass(command_buffer, &render_pass_begin_info, + VK_SUBPASS_CONTENTS_INLINE); + return render_pass; } @@ -44,6 +75,9 @@ void RenderCache::EndRenderPass() { assert_not_null(current_command_buffer_); auto command_buffer = current_command_buffer_; current_command_buffer_ = nullptr; + + // End the render pass. + vkCmdEndRenderPass(command_buffer); } void RenderCache::ClearCache() { diff --git a/src/xenia/gpu/vulkan/render_cache.h b/src/xenia/gpu/vulkan/render_cache.h index ceeea2a07..2bdcef924 100644 --- a/src/xenia/gpu/vulkan/render_cache.h +++ b/src/xenia/gpu/vulkan/render_cache.h @@ -52,6 +52,9 @@ class RenderCache { private: RegisterFile* register_file_ = nullptr; VkDevice device_ = nullptr; + + // Only valid during a BeginRenderPass/EndRenderPass block. + VkCommandBuffer current_command_buffer_ = nullptr; }; } // namespace vulkan