VideoCommon: Add separate pipeline usage for UberShaders
This commit is contained in:
parent
d289e9c51c
commit
99533d2840
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue