VideoCommon: Add separate pipeline usage for UberShaders

This commit is contained in:
TellowKrinkle 2022-06-18 20:03:28 -05:00
parent d289e9c51c
commit 99533d2840
9 changed files with 19 additions and 18 deletions

View File

@ -572,7 +572,8 @@ bool Renderer::ApplyState()
m_state.sampler_descriptor_base); m_state.sampler_descriptor_base);
} }
if (static_cast<const DXPipeline*>(m_current_pipeline)->GetUsage() == AbstractPipelineUsage::GX) if (static_cast<const DXPipeline*>(m_current_pipeline)->GetUsage() !=
AbstractPipelineUsage::Utility)
{ {
if (dirty_bits & DirtyState_VS_CBV) if (dirty_bits & DirtyState_VS_CBV)
{ {

View File

@ -165,6 +165,7 @@ std::unique_ptr<DXPipeline> DXPipeline::Create(const AbstractPipelineConfig& con
switch (config.usage) switch (config.usage)
{ {
case AbstractPipelineUsage::GX: case AbstractPipelineUsage::GX:
case AbstractPipelineUsage::GXUber:
desc.pRootSignature = g_dx_context->GetGXRootSignature(); desc.pRootSignature = g_dx_context->GetGXRootSignature();
break; break;
case AbstractPipelineUsage::Utility: case AbstractPipelineUsage::Utility:

View File

@ -377,18 +377,12 @@ public:
auto desc = MRCTransfer([MTLRenderPipelineDescriptor new]); auto desc = MRCTransfer([MTLRenderPipelineDescriptor new]);
[desc setVertexFunction:static_cast<const Shader*>(config.vertex_shader)->GetShader()]; [desc setVertexFunction:static_cast<const Shader*>(config.vertex_shader)->GetShader()];
[desc setFragmentFunction:static_cast<const Shader*>(config.pixel_shader)->GetShader()]; [desc setFragmentFunction:static_cast<const Shader*>(config.pixel_shader)->GetShader()];
if (config.usage == AbstractPipelineUsage::GX) if (config.usage == AbstractPipelineUsage::GXUber)
{ [desc setLabel:[NSString stringWithFormat:@"GX Uber Pipeline %d", m_pipeline_counter[0]++]];
if ([[[desc vertexFunction] label] containsString:@"Uber"]) else if (config.usage == AbstractPipelineUsage::GX)
[desc
setLabel:[NSString stringWithFormat:@"GX Uber Pipeline %d", m_pipeline_counter[0]++]];
else
[desc setLabel:[NSString stringWithFormat:@"GX Pipeline %d", m_pipeline_counter[1]++]]; [desc setLabel:[NSString stringWithFormat:@"GX Pipeline %d", m_pipeline_counter[1]++]];
}
else else
{
[desc setLabel:[NSString stringWithFormat:@"Utility Pipeline %d", m_pipeline_counter[2]++]]; [desc setLabel:[NSString stringWithFormat:@"Utility Pipeline %d", m_pipeline_counter[2]++]];
}
if (config.vertex_format) if (config.vertex_format)
[desc setVertexDescriptor:static_cast<const VertexFormat*>(config.vertex_format)->Get()]; [desc setVertexDescriptor:static_cast<const VertexFormat*>(config.vertex_format)->Get()];
RasterizationState rs = config.rasterization_state; RasterizationState rs = config.rasterization_state;

View File

@ -608,7 +608,7 @@ void Metal::StateTracker::PrepareRender()
BeginRenderPass(MTLLoadActionLoad); BeginRenderPass(MTLLoadActionLoad);
id<MTLRenderCommandEncoder> enc = m_current_render_encoder; id<MTLRenderCommandEncoder> enc = m_current_render_encoder;
const Pipeline* pipe = m_state.render_pipeline; const Pipeline* pipe = m_state.render_pipeline;
bool is_gx = pipe->Usage() == AbstractPipelineUsage::GX; bool is_gx = pipe->Usage() != AbstractPipelineUsage::Utility;
NSString* label = is_gx ? LABEL_GX : LABEL_UTIL; NSString* label = is_gx ? LABEL_GX : LABEL_UTIL;
if (m_flags.should_apply_label && m_current.label != label) if (m_flags.should_apply_label && m_current.label != label)
{ {

View File

@ -452,7 +452,7 @@ void StateTracker::EndClearRenderPass()
bool StateTracker::UpdateDescriptorSet() bool StateTracker::UpdateDescriptorSet()
{ {
if (m_pipeline->GetUsage() == AbstractPipelineUsage::GX) if (m_pipeline->GetUsage() != AbstractPipelineUsage::Utility)
return UpdateGXDescriptorSet(); return UpdateGXDescriptorSet();
else else
return UpdateUtilityDescriptorSet(); return UpdateUtilityDescriptorSet();

View File

@ -249,6 +249,7 @@ std::unique_ptr<VKPipeline> VKPipeline::Create(const AbstractPipelineConfig& con
switch (config.usage) switch (config.usage)
{ {
case AbstractPipelineUsage::GX: case AbstractPipelineUsage::GX:
case AbstractPipelineUsage::GXUber:
pipeline_layout = g_object_cache->GetPipelineLayout(PIPELINE_LAYOUT_STANDARD); pipeline_layout = g_object_cache->GetPipelineLayout(PIPELINE_LAYOUT_STANDARD);
break; break;
case AbstractPipelineUsage::Utility: case AbstractPipelineUsage::Utility:

View File

@ -20,6 +20,8 @@ class NativeVertexFormat;
// - Per-stage UBO (VS/GS/PS, VS constants accessible from PS) // - Per-stage UBO (VS/GS/PS, VS constants accessible from PS)
// - 8 combined image samplers (accessible from PS) // - 8 combined image samplers (accessible from PS)
// - 1 SSBO, accessible from PS if bounding box is enabled // - 1 SSBO, accessible from PS if bounding box is enabled
// - GX Uber
// - Same as GX, plus one VS SSBO for vertices if dynamic vertex loading is enabled
// - Utility // - Utility
// - Single UBO, accessible from all stages [set=0, binding=1] // - Single UBO, accessible from all stages [set=0, binding=1]
// - 8 combined image samplers (accessible from PS) [set=1, binding=0-7] // - 8 combined image samplers (accessible from PS) [set=1, binding=0-7]
@ -32,6 +34,7 @@ class NativeVertexFormat;
enum class AbstractPipelineUsage enum class AbstractPipelineUsage
{ {
GX, GX,
GXUber,
Utility Utility
}; };

View File

@ -588,10 +588,10 @@ AbstractPipelineConfig ShaderCache::GetGXPipelineConfig(
const NativeVertexFormat* vertex_format, const AbstractShader* vertex_shader, const NativeVertexFormat* vertex_format, const AbstractShader* vertex_shader,
const AbstractShader* geometry_shader, const AbstractShader* pixel_shader, const AbstractShader* geometry_shader, const AbstractShader* pixel_shader,
const RasterizationState& rasterization_state, const DepthState& depth_state, const RasterizationState& rasterization_state, const DepthState& depth_state,
const BlendingState& blending_state) const BlendingState& blending_state, AbstractPipelineUsage usage)
{ {
AbstractPipelineConfig config = {}; AbstractPipelineConfig config = {};
config.usage = AbstractPipelineUsage::GX; config.usage = usage;
config.vertex_format = vertex_format; config.vertex_format = vertex_format;
config.vertex_shader = vertex_shader; config.vertex_shader = vertex_shader;
config.geometry_shader = geometry_shader; config.geometry_shader = geometry_shader;
@ -735,7 +735,7 @@ ShaderCache::GetGXPipelineConfig(const GXPipelineUid& config_in)
} }
return GetGXPipelineConfig(config.vertex_format, vs, gs, ps, config.rasterization_state, return GetGXPipelineConfig(config.vertex_format, vs, gs, ps, config.rasterization_state,
config.depth_state, config.blending_state); config.depth_state, config.blending_state, AbstractPipelineUsage::GX);
} }
/// Edits the UID based on driver bugs and other special configurations /// Edits the UID based on driver bugs and other special configurations
@ -800,7 +800,8 @@ ShaderCache::GetGXPipelineConfig(const GXUberPipelineUid& config_in)
} }
return GetGXPipelineConfig(config.vertex_format, vs, gs, ps, config.rasterization_state, return GetGXPipelineConfig(config.vertex_format, vs, gs, ps, config.rasterization_state,
config.depth_state, config.blending_state); config.depth_state, config.blending_state,
AbstractPipelineUsage::GXUber);
} }
const AbstractPipeline* ShaderCache::InsertGXPipeline(const GXPipelineUid& config, const AbstractPipeline* ShaderCache::InsertGXPipeline(const GXPipelineUid& config,

View File

@ -151,7 +151,7 @@ private:
GetGXPipelineConfig(const NativeVertexFormat* vertex_format, const AbstractShader* vertex_shader, GetGXPipelineConfig(const NativeVertexFormat* vertex_format, const AbstractShader* vertex_shader,
const AbstractShader* geometry_shader, const AbstractShader* pixel_shader, const AbstractShader* geometry_shader, const AbstractShader* pixel_shader,
const RasterizationState& rasterization_state, const DepthState& depth_state, const RasterizationState& rasterization_state, const DepthState& depth_state,
const BlendingState& blending_state); const BlendingState& blending_state, AbstractPipelineUsage usage);
std::optional<AbstractPipelineConfig> GetGXPipelineConfig(const GXPipelineUid& uid); std::optional<AbstractPipelineConfig> GetGXPipelineConfig(const GXPipelineUid& uid);
std::optional<AbstractPipelineConfig> GetGXPipelineConfig(const GXUberPipelineUid& uid); std::optional<AbstractPipelineConfig> GetGXPipelineConfig(const GXUberPipelineUid& uid);
const AbstractPipeline* InsertGXPipeline(const GXPipelineUid& config, const AbstractPipeline* InsertGXPipeline(const GXPipelineUid& config,