From 1e1da1eb6c78a70f18d188228a79a99fe3f9072f Mon Sep 17 00:00:00 2001 From: "Dr. Chat" Date: Fri, 25 Mar 2016 16:34:14 -0500 Subject: [PATCH] PipelineCache::ConfigurePipeline - Inform the caller if the pipeline is dirty or they can reuse the previously bound pipeline. Make SetDynamicState public. --- src/xenia/gpu/vulkan/pipeline_cache.cc | 31 ++++++++---------------- src/xenia/gpu/vulkan/pipeline_cache.h | 33 +++++++++++++------------- 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/src/xenia/gpu/vulkan/pipeline_cache.cc b/src/xenia/gpu/vulkan/pipeline_cache.cc index ee1174a72..efcaf5b46 100644 --- a/src/xenia/gpu/vulkan/pipeline_cache.cc +++ b/src/xenia/gpu/vulkan/pipeline_cache.cc @@ -183,11 +183,12 @@ VulkanShader* PipelineCache::LoadShader(ShaderType shader_type, return shader; } -bool PipelineCache::ConfigurePipeline(VkCommandBuffer command_buffer, - const RenderState* render_state, - VulkanShader* vertex_shader, - VulkanShader* pixel_shader, - PrimitiveType primitive_type) { +PipelineCache::UpdateStatus PipelineCache::ConfigurePipeline( + VkCommandBuffer command_buffer, const RenderState* render_state, + VulkanShader* vertex_shader, VulkanShader* pixel_shader, + PrimitiveType primitive_type, VkPipeline* pipeline_out) { + assert_not_null(pipeline_out); + // Perform a pass over all registers and state updating our cached structures. // This will tell us if anything has changed that requires us to either build // a new pipeline or use an existing one. @@ -208,7 +209,7 @@ bool PipelineCache::ConfigurePipeline(VkCommandBuffer command_buffer, // Error updating state - bail out. // We are in an indeterminate state, so reset things for the next attempt. current_pipeline_ = nullptr; - return false; + return update_status; } if (!pipeline) { // Should have a hash key produced by the UpdateState pass. @@ -217,24 +218,12 @@ bool PipelineCache::ConfigurePipeline(VkCommandBuffer command_buffer, current_pipeline_ = pipeline; if (!pipeline) { // Unable to create pipeline. - return false; + return UpdateStatus::kError; } } - // Bind the pipeline. - vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); - - // Issue all changed dynamic state information commands. - // TODO(benvanik): dynamic state is kept in the command buffer, so if we - // have issued it before (regardless of pipeline) we don't need to do it now. - // TODO(benvanik): track whether we have issued on the given command buffer. - bool full_dynamic_state = true; - if (!SetDynamicState(command_buffer, full_dynamic_state)) { - // Failed to update state. - return false; - } - - return true; + *pipeline_out = pipeline; + return update_status; } void PipelineCache::ClearCache() { diff --git a/src/xenia/gpu/vulkan/pipeline_cache.h b/src/xenia/gpu/vulkan/pipeline_cache.h index b33c030ed..66b2e87ef 100644 --- a/src/xenia/gpu/vulkan/pipeline_cache.h +++ b/src/xenia/gpu/vulkan/pipeline_cache.h @@ -32,6 +32,12 @@ namespace vulkan { // including shaders, various blend/etc options, and input configuration. class PipelineCache { public: + enum class UpdateStatus { + kCompatible, + kMismatch, + kError, + }; + PipelineCache(RegisterFile* register_file, ui::vulkan::VulkanDevice* device, VkDescriptorSetLayout uniform_descriptor_set_layout, VkDescriptorSetLayout texture_descriptor_set_layout); @@ -46,11 +52,17 @@ class PipelineCache { // otherwise a new one may be created. Any state that can be set dynamically // in the command buffer is issued at this time. // Returns whether the pipeline could be successfully created. - bool ConfigurePipeline(VkCommandBuffer command_buffer, - const RenderState* render_state, - VulkanShader* vertex_shader, - VulkanShader* pixel_shader, - PrimitiveType primitive_type); + UpdateStatus ConfigurePipeline(VkCommandBuffer command_buffer, + const RenderState* render_state, + VulkanShader* vertex_shader, + VulkanShader* pixel_shader, + PrimitiveType primitive_type, + VkPipeline* pipeline_out); + + // Sets required dynamic state on the command buffer. + // Only state that has changed since the last call will be set unless + // full_update is true. + bool SetDynamicState(VkCommandBuffer command_buffer, bool full_update); // Pipeline layout shared by all pipelines. VkPipelineLayout pipeline_layout() const { return pipeline_layout_; } @@ -68,11 +80,6 @@ class PipelineCache { VkShaderModule GetGeometryShader(PrimitiveType primitive_type, bool is_line_mode); - // Sets required dynamic state on the command buffer. - // Only state that has changed since the last call will be set unless - // full_update is true. - bool SetDynamicState(VkCommandBuffer command_buffer, bool full_update); - RegisterFile* register_file_ = nullptr; VkDevice device_ = nullptr; @@ -111,12 +118,6 @@ class PipelineCache { VkPipeline current_pipeline_ = nullptr; private: - enum class UpdateStatus { - kCompatible, - kMismatch, - kError, - }; - UpdateStatus UpdateState(VulkanShader* vertex_shader, VulkanShader* pixel_shader, PrimitiveType primitive_type);