diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp index bb60525f..3805fcf5 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.cpp @@ -439,7 +439,7 @@ namespace skyline::gpu::interconnect::maxwell3d { /* Rasterizer State */ void RasterizationState::EngineRegisters::DirtyBind(DirtyManager &manager, dirty::Handle handle) const { - manager.Bind(handle, rasterEnable, frontPolygonMode, backPolygonMode, viewportClipControl, oglCullEnable, oglFrontFace, oglCullFace, windowOrigin, provokingVertex, polyOffset); + manager.Bind(handle, rasterEnable, frontPolygonMode, backPolygonMode, viewportClipControl, oglCullEnable, oglFrontFace, oglCullFace, windowOrigin, provokingVertex, polyOffset, pointSize, zClipRange); } RasterizationState::RasterizationState(dirty::Handle dirtyHandle, DirtyManager &manager, const EngineRegisters &engine) : engine{manager, dirtyHandle, engine} {} @@ -457,8 +457,6 @@ namespace skyline::gpu::interconnect::maxwell3d { } } - - void RasterizationState::Flush(PackedPipelineState &packedState) { packedState.rasterizerDiscardEnable = !engine->rasterEnable; packedState.SetPolygonMode(engine->frontPolygonMode); @@ -475,6 +473,8 @@ namespace skyline::gpu::interconnect::maxwell3d { packedState.frontFaceClockwise = (packedState.flipYEnable != origFrontFaceClockwise); packedState.depthBiasEnable = ConvertDepthBiasEnable(engine->polyOffset, engine->frontPolygonMode); packedState.provokingVertex = engine->provokingVertex.value; + packedState.pointSize = engine->pointSize; + packedState.openGlNdc = engine->zClipRange == engine::ZClipRange::NegativeWToPositiveW; } /* Depth Stencil State */ @@ -519,7 +519,7 @@ namespace skyline::gpu::interconnect::maxwell3d { /* Global Shader Config State */ void GlobalShaderConfigState::EngineRegisters::DirtyBind(DirtyManager &manager, dirty::Handle handle) const { - manager.Bind(handle, postVtgShaderAttributeSkipMask, bindlessTexture); + manager.Bind(handle, postVtgShaderAttributeSkipMask, bindlessTexture, apiMandatedEarlyZ); } GlobalShaderConfigState::GlobalShaderConfigState(const EngineRegisters &engine) : engine{engine} {} @@ -527,6 +527,7 @@ namespace skyline::gpu::interconnect::maxwell3d { void GlobalShaderConfigState::Update(PackedPipelineState &packedState) { packedState.postVtgShaderAttributeSkipMask = engine.postVtgShaderAttributeSkipMask; packedState.bindlessTextureConstantBufferSlotSelect = engine.bindlessTexture.constantBufferSlotSelect; + packedState.apiMandatedEarlyZ = engine.apiMandatedEarlyZ; } /* Pipeline State */ diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.h b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.h index 1c9f574d..8969c158 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.h +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_state.h @@ -164,6 +164,8 @@ namespace skyline::gpu::interconnect::maxwell3d { const engine::ViewportClipControl &viewportClipControl; const engine::PolyOffset &polyOffset; const engine::ProvokingVertex &provokingVertex; + const float &pointSize; + const engine::ZClipRange &zClipRange; void DirtyBind(DirtyManager &manager, dirty::Handle handle) const; }; @@ -230,6 +232,7 @@ namespace skyline::gpu::interconnect::maxwell3d { struct EngineRegisters { const std::array &postVtgShaderAttributeSkipMask; const engine::BindlessTexture &bindlessTexture; + const u32 &apiMandatedEarlyZ; void DirtyBind(DirtyManager &manager, dirty::Handle handle) const; }; diff --git a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp index 43a56a53..1c16faef 100644 --- a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp +++ b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp @@ -20,10 +20,10 @@ namespace skyline::soc::gm20b::engine::maxwell3d { .vertexInputRegisters = {*registers.vertexStreams, *registers.vertexStreamInstance, *registers.vertexAttributes}, .inputAssemblyRegisters = {*registers.primitiveRestartEnable}, .tessellationRegisters = {*registers.patchSize, *registers.tessellationParameters}, - .rasterizationRegisters = {*registers.rasterEnable, *registers.frontPolygonMode, *registers.backPolygonMode, *registers.oglCullEnable, *registers.oglCullFace, *registers.windowOrigin, *registers.oglFrontFace, *registers.viewportClipControl, *registers.polyOffset, *registers.provokingVertex}, + .rasterizationRegisters = {*registers.rasterEnable, *registers.frontPolygonMode, *registers.backPolygonMode, *registers.oglCullEnable, *registers.oglCullFace, *registers.windowOrigin, *registers.oglFrontFace, *registers.viewportClipControl, *registers.polyOffset, *registers.provokingVertex, *registers.pointSize, *registers.zClipRange}, .depthStencilRegisters = {*registers.depthTestEnable, *registers.depthWriteEnable, *registers.depthFunc, *registers.depthBoundsTestEnable, *registers.stencilTestEnable, *registers.twoSidedStencilTestEnable, *registers.stencilOps, *registers.stencilBack}, .colorBlendRegisters = {*registers.logicOp, *registers.singleCtWriteControl, *registers.ctWrites, *registers.blendStatePerTargetEnable, *registers.blendPerTargets, *registers.blend}, - .globalShaderConfigRegisters = {*registers.postVtgShaderAttributeSkipMask, *registers.bindlessTexture} + .globalShaderConfigRegisters = {*registers.postVtgShaderAttributeSkipMask, *registers.bindlessTexture, *registers.apiMandatedEarlyZEnable} }; } diff --git a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h index d5606e30..ab4a6dde 100644 --- a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h +++ b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h @@ -111,6 +111,8 @@ namespace skyline::soc::gm20b::engine::maxwell3d { Register<0x60, Inline2MemoryBackend::RegisterState> i2m; + Register<0x84, u32> apiMandatedEarlyZEnable; + Register<0xB2, type::SyncpointAction> syncpointAction; Register<0xC8, type::TessellationParameters> tessellationParameters;