Avoid InterconnectContext use in graphics PipelineManager

We will soon move to a global pipeline manager instance, so it wont be possible to use InterconnectContext at pipeline-creation time anymore
This commit is contained in:
Billy Laws 2022-12-10 15:37:31 +00:00
parent ffe7263848
commit 7dd3a1db0f
2 changed files with 24 additions and 23 deletions

View File

@ -173,8 +173,8 @@ namespace skyline::gpu::interconnect::maxwell3d {
return info;
}
static std::array<Pipeline::ShaderStage, engine::ShaderStageCount> MakePipelineShaders(InterconnectContext &ctx, const PipelineStateAccessor &accessor, const PackedPipelineState &packedState) {
ctx.gpu.shader.ResetPools();
static std::array<Pipeline::ShaderStage, engine::ShaderStageCount> MakePipelineShaders(GPU &gpu, const PipelineStateAccessor &accessor, const PackedPipelineState &packedState) {
gpu.shader.ResetPools();
using PipelineStage = engine::Pipeline::Shader::Type;
auto pipelineStage{[](u32 i) { return static_cast<PipelineStage>(i); }};
@ -188,7 +188,7 @@ namespace skyline::gpu::interconnect::maxwell3d {
continue;
auto binary{accessor.GetShaderBinary(i)};
auto program{ctx.gpu.shader.ParseGraphicsShader(
auto program{gpu.shader.ParseGraphicsShader(
packedState.postVtgShaderAttributeSkipMask,
ConvertCompilerShaderStage(static_cast<PipelineStage>(i)),
binary.binary, binary.baseOffset,
@ -202,7 +202,7 @@ namespace skyline::gpu::interconnect::maxwell3d {
})};
if (i == stageIdx(PipelineStage::Vertex) && packedState.shaderHashes[stageIdx(PipelineStage::VertexCullBeforeFetch)]) {
ignoreVertexCullBeforeFetch = true;
programs[i] = ctx.gpu.shader.CombineVertexShaders(programs[stageIdx(PipelineStage::VertexCullBeforeFetch)], program, binary.binary);
programs[i] = gpu.shader.CombineVertexShaders(programs[stageIdx(PipelineStage::VertexCullBeforeFetch)], program, binary.binary);
} else {
programs[i] = program;
}
@ -219,7 +219,7 @@ namespace skyline::gpu::interconnect::maxwell3d {
continue;
auto runtimeInfo{MakeRuntimeInfo(packedState, programs[i], lastProgram, hasGeometry)};
shaderStages[i - (i >= 1 ? 1 : 0)] = {ConvertVkShaderStage(pipelineStage(i)), ctx.gpu.shader.CompileShader(runtimeInfo, programs[i], bindings), programs[i].info};
shaderStages[i - (i >= 1 ? 1 : 0)] = {ConvertVkShaderStage(pipelineStage(i)), gpu.shader.CompileShader(runtimeInfo, programs[i], bindings), programs[i].info};
lastProgram = &programs[i];
}
@ -422,7 +422,7 @@ namespace skyline::gpu::interconnect::maxwell3d {
}
}
static cache::GraphicsPipelineCache::CompiledPipeline MakeCompiledPipeline(InterconnectContext &ctx,
static cache::GraphicsPipelineCache::CompiledPipeline MakeCompiledPipeline(GPU &gpu,
const PackedPipelineState &packedState,
const std::array<Pipeline::ShaderStage, engine::ShaderStageCount> &shaderStages,
span<vk::DescriptorSetLayoutBinding> layoutBindings) {
@ -448,10 +448,10 @@ namespace skyline::gpu::interconnect::maxwell3d {
});
if (binding.GetInputRate() == vk::VertexInputRate::eInstance) {
if (!ctx.gpu.traits.supportsVertexAttributeDivisor)
if (!gpu.traits.supportsVertexAttributeDivisor)
[[unlikely]]
Logger::Warn("Vertex attribute divisor used on guest without host support");
else if (!ctx.gpu.traits.supportsVertexAttributeZeroDivisor && binding.divisor == 0)
else if (!gpu.traits.supportsVertexAttributeZeroDivisor && binding.divisor == 0)
[[unlikely]]
Logger::Warn("Vertex attribute zero divisor used on guest without host support");
else
@ -507,7 +507,7 @@ namespace skyline::gpu::interconnect::maxwell3d {
rasterizationCreateInfo.frontFace = packedState.frontFaceClockwise ? vk::FrontFace::eClockwise : vk::FrontFace::eCounterClockwise;
rasterizationCreateInfo.depthBiasEnable = packedState.depthBiasEnable;
rasterizationCreateInfo.depthClampEnable = packedState.depthClampEnable;
if (!ctx.gpu.traits.supportsDepthClamp)
if (!gpu.traits.supportsDepthClamp)
Logger::Warn("Depth clamp used on guest without host support");
rasterizationState.get<vk::PipelineRasterizationProvokingVertexStateCreateInfoEXT>().provokingVertexMode = ConvertProvokingVertex(packedState.provokingVertex);
@ -560,7 +560,7 @@ namespace skyline::gpu::interconnect::maxwell3d {
};
vk::PipelineDynamicStateCreateInfo dynamicState{
.dynamicStateCount = ctx.gpu.traits.supportsExtendedDynamicState ? ExtendedDynamicStateCount : BaseDynamicStateCount,
.dynamicStateCount = gpu.traits.supportsExtendedDynamicState ? ExtendedDynamicStateCount : BaseDynamicStateCount,
.pDynamicStates = dynamicStates.data()
};
@ -569,15 +569,15 @@ namespace skyline::gpu::interconnect::maxwell3d {
std::array<vk::Viewport, engine::ViewportCount> emptyViewports{};
vk::PipelineViewportStateCreateInfo viewportState{
.viewportCount = static_cast<u32>(ctx.gpu.traits.supportsMultipleViewports ? engine::ViewportCount : 1),
.viewportCount = static_cast<u32>(gpu.traits.supportsMultipleViewports ? engine::ViewportCount : 1),
.pViewports = emptyViewports.data(),
.scissorCount = static_cast<u32>(ctx.gpu.traits.supportsMultipleViewports ? engine::ViewportCount : 1),
.scissorCount = static_cast<u32>(gpu.traits.supportsMultipleViewports ? engine::ViewportCount : 1),
.pScissors = emptyScissors.data(),
};
texture::Format depthStencilFormat{packedState.GetDepthRenderTargetFormat()};
return ctx.gpu.graphicsPipelineCache.GetCompiledPipeline(cache::GraphicsPipelineCache::PipelineState{
return gpu.graphicsPipelineCache.GetCompiledPipeline(cache::GraphicsPipelineCache::PipelineState{
.shaderStages = shaderStageInfos,
.vertexState = vertexInputState,
.inputAssemblyState = inputAssemblyState,
@ -594,20 +594,21 @@ namespace skyline::gpu::interconnect::maxwell3d {
}, layoutBindings);
}
Pipeline::Pipeline(InterconnectContext &ctx, const PipelineStateAccessor &accessor, const PackedPipelineState &packedState)
Pipeline::Pipeline(GPU &gpu, PipelineStateAccessor &accessor, const PackedPipelineState &packedState)
: sourcePackedState{packedState},
shaderStages{MakePipelineShaders(ctx, accessor, sourcePackedState)},
descriptorInfo{MakePipelineDescriptorInfo(shaderStages, ctx.gpu.traits.quirks.needsIndividualTextureBindingWrites)},
compiledPipeline{MakeCompiledPipeline(ctx, sourcePackedState, shaderStages, descriptorInfo.descriptorSetLayoutBindings)} {
shaderStages{MakePipelineShaders(gpu, accessor, sourcePackedState)},
descriptorInfo{MakePipelineDescriptorInfo(shaderStages, gpu.traits.quirks.needsIndividualTextureBindingWrites)},
compiledPipeline{MakeCompiledPipeline(gpu, sourcePackedState, shaderStages, descriptorInfo.descriptorSetLayoutBindings)} {
storageBufferViews.resize(descriptorInfo.totalStorageBufferCount);
accessor.MarkComplete();
}
void Pipeline::SyncCachedStorageBufferViews(u32 executionNumber) {
if (lastExecutionNumber != executionNumber) {
void Pipeline::SyncCachedStorageBufferViews(ContextTag executionTag) {
if (lastExecutionTag != executionTag) {
for (auto &view : storageBufferViews)
view.PurgeCaches();
lastExecutionNumber = executionNumber;
lastExecutionTag = executionTag;
}
}

View File

@ -8,10 +8,10 @@
#include <gpu/cache/graphics_pipeline_cache.h>
#include <gpu/interconnect/common/samplers.h>
#include <gpu/interconnect/common/textures.h>
#include <gpu/interconnect/common/pipeline_state_accessor.h>
#include "common.h"
#include "packed_pipeline_state.h"
#include "constant_buffers.h"
#include "graphics_pipeline_state_accessor.h"
namespace skyline::gpu {
class TextureView;
@ -95,13 +95,13 @@ namespace skyline::gpu::interconnect::maxwell3d {
tsl::robin_map<Pipeline *, bool> bindingMatchCache; //!< Cache of which pipelines have bindings that match this pipeline
void SyncCachedStorageBufferViews(u32 executionNumber);
void SyncCachedStorageBufferViews(ContextTag executionTag);
public:
cache::GraphicsPipelineCache::CompiledPipeline compiledPipeline;
size_t sampledImageCount{};
Pipeline(InterconnectContext &ctx, const PipelineStateAccessor &accessor, const PackedPipelineState &packedState);
Pipeline(GPU &gpu, PipelineStateAccessor &accessor, const PackedPipelineState &packedState);
Pipeline *LookupNext(const PackedPipelineState &packedState);