From 61e95c4b2c0ed08e2e27a894e17d11f38a388a27 Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Fri, 18 Nov 2022 21:03:02 +0000 Subject: [PATCH] Commonise maxwell3d sampler code This will be shared with the compute engine implementation, the only thing of note with this is that the binding register is now passed as a param since it is part of the compute QMD which can't be dirty tracked. --- .../{maxwell_3d => common}/samplers.cpp | 21 +++++++++++++------ .../{maxwell_3d => common}/samplers.h | 17 ++++++++------- .../interconnect/{maxwell_3d => common}/tsc.h | 0 .../interconnect/maxwell_3d/maxwell_3d.cpp | 2 ++ .../gpu/interconnect/maxwell_3d/maxwell_3d.h | 4 +++- .../maxwell_3d/pipeline_manager.h | 2 +- .../cpp/skyline/soc/gm20b/engines/engine.h | 6 ++++++ .../soc/gm20b/engines/kepler_compute.h | 3 +-- .../skyline/soc/gm20b/engines/maxwell/types.h | 6 ------ .../skyline/soc/gm20b/engines/maxwell_3d.cpp | 3 ++- .../skyline/soc/gm20b/engines/maxwell_3d.h | 7 +++---- 11 files changed, 43 insertions(+), 28 deletions(-) rename app/src/main/cpp/skyline/gpu/interconnect/{maxwell_3d => common}/samplers.cpp (93%) rename app/src/main/cpp/skyline/gpu/interconnect/{maxwell_3d => common}/samplers.h (69%) rename app/src/main/cpp/skyline/gpu/interconnect/{maxwell_3d => common}/tsc.h (100%) diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/samplers.cpp b/app/src/main/cpp/skyline/gpu/interconnect/common/samplers.cpp similarity index 93% rename from app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/samplers.cpp rename to app/src/main/cpp/skyline/gpu/interconnect/common/samplers.cpp index e83233f8..5663143a 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/samplers.cpp +++ b/app/src/main/cpp/skyline/gpu/interconnect/common/samplers.cpp @@ -5,19 +5,24 @@ #include #include "samplers.h" -namespace skyline::gpu::interconnect::maxwell3d { +namespace skyline::gpu::interconnect { void SamplerPoolState::EngineRegisters::DirtyBind(DirtyManager &manager, dirty::Handle handle) const { - manager.Bind(handle, samplerBinding, texSamplerPool, texHeaderPool); + manager.Bind(handle, texSamplerPool, texHeaderPool); } SamplerPoolState::SamplerPoolState(dirty::Handle dirtyHandle, DirtyManager &manager, const EngineRegisters &engine) : engine{manager, dirtyHandle, engine} {} - void SamplerPoolState::Flush(InterconnectContext &ctx) { - useTexHeaderBinding = engine->samplerBinding.value == engine::SamplerBinding::Value::ViaHeaderBinding; + void SamplerPoolState::Flush(InterconnectContext &ctx, bool useTexHeaderBinding) { u32 maximumIndex{useTexHeaderBinding ? engine->texHeaderPool.maximumIndex : engine->texSamplerPool.maximumIndex}; auto mapping{ctx.channelCtx.asCtx->gmmu.LookupBlock(engine->texSamplerPool.offset)}; texSamplers = mapping.first.subspan(mapping.second).cast().first(maximumIndex + 1); + + didUseTexHeaderBinding = useTexHeaderBinding; + } + + bool SamplerPoolState::Refresh(InterconnectContext &ctx, bool useTexHeaderBinding) { + return didUseTexHeaderBinding != useTexHeaderBinding; } void SamplerPoolState::PurgeCaches() { @@ -26,6 +31,10 @@ namespace skyline::gpu::interconnect::maxwell3d { Samplers::Samplers(DirtyManager &manager, const SamplerPoolState::EngineRegisters &engine) : samplerPool{manager, engine} {} + void Samplers::Update(InterconnectContext &ctx, bool useTexHeaderBinding) { + samplerPool.Update(ctx, useTexHeaderBinding); + } + void Samplers::MarkAllDirty() { samplerPool.MarkDirty(true); std::fill(texSamplerCache.begin(), texSamplerCache.end(), nullptr); @@ -140,8 +149,8 @@ namespace skyline::gpu::interconnect::maxwell3d { } vk::raii::Sampler *Samplers::GetSampler(InterconnectContext &ctx, u32 samplerIndex, u32 textureIndex) { - const auto &samplerPoolObj{samplerPool.UpdateGet(ctx)}; - u32 index{samplerPoolObj.useTexHeaderBinding ? textureIndex : samplerIndex}; + const auto &samplerPoolObj{samplerPool.Get()}; + u32 index{samplerPoolObj.didUseTexHeaderBinding ? textureIndex : samplerIndex}; auto texSamplers{samplerPoolObj.texSamplers}; if (texSamplers.size() != texSamplerCache.size()) { texSamplerCache.resize(texSamplers.size()); diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/samplers.h b/app/src/main/cpp/skyline/gpu/interconnect/common/samplers.h similarity index 69% rename from app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/samplers.h rename to app/src/main/cpp/skyline/gpu/interconnect/common/samplers.h index 0f1a2e5e..87cb1858 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/samplers.h +++ b/app/src/main/cpp/skyline/gpu/interconnect/common/samplers.h @@ -7,13 +7,12 @@ #include "common.h" #include "tsc.h" -namespace skyline::gpu::interconnect::maxwell3d { - class SamplerPoolState : dirty::CachedManualDirty { +namespace skyline::gpu::interconnect { + class SamplerPoolState : dirty::CachedManualDirty, dirty::RefreshableManualDirty { public: struct EngineRegisters { - const engine::SamplerBinding &samplerBinding; - const engine::TexSamplerPool &texSamplerPool; - const engine::TexHeaderPool &texHeaderPool; + const engine_common::TexSamplerPool &texSamplerPool; + const engine_common::TexHeaderPool &texHeaderPool; void DirtyBind(DirtyManager &manager, dirty::Handle handle) const; }; @@ -23,11 +22,13 @@ namespace skyline::gpu::interconnect::maxwell3d { public: span texSamplers; - bool useTexHeaderBinding; + bool didUseTexHeaderBinding; SamplerPoolState(dirty::Handle dirtyHandle, DirtyManager &manager, const EngineRegisters &engine); - void Flush(InterconnectContext &ctx); + void Flush(InterconnectContext &ctx, bool useTexHeaderBinding); + + bool Refresh(InterconnectContext &ctx, bool useTexHeaderBinding); void PurgeCaches(); }; @@ -42,6 +43,8 @@ namespace skyline::gpu::interconnect::maxwell3d { public: Samplers(DirtyManager &manager, const SamplerPoolState::EngineRegisters &engine); + void Update(InterconnectContext &ctx, bool useTexHeaderBinding); + void MarkAllDirty(); vk::raii::Sampler *GetSampler(InterconnectContext &ctx, u32 samplerIndex, u32 textureIndex); diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/tsc.h b/app/src/main/cpp/skyline/gpu/interconnect/common/tsc.h similarity index 100% rename from app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/tsc.h rename to app/src/main/cpp/skyline/gpu/interconnect/common/tsc.h diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/maxwell_3d.cpp b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/maxwell_3d.cpp index 4f054e52..f16845d7 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/maxwell_3d.cpp +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/maxwell_3d.cpp @@ -22,6 +22,7 @@ namespace skyline::gpu::interconnect::maxwell3d { clearEngineRegisters{registerBundle.clearRegisters}, constantBuffers{manager, registerBundle.constantBufferSelectorRegisters}, samplers{manager, registerBundle.samplerPoolRegisters}, + samplerBinding{registerBundle.samplerBinding}, textures{manager, registerBundle.texturePoolRegisters}, directState{activeState.directState} { ctx.executor.AddFlushCallback([this] { @@ -213,6 +214,7 @@ namespace skyline::gpu::interconnect::maxwell3d { StateUpdateBuilder builder{*ctx.executor.allocator}; Pipeline *oldPipeline{activeState.GetPipeline()}; + samplers.Update(ctx, samplerBinding.value == engine::SamplerBinding::Value::ViaHeaderBinding); activeState.Update(ctx, textures, constantBuffers.boundConstantBuffers, builder, indexed, topology, first, count); if (directState.inputAssembly.NeedsQuadConversion()) { count = conversion::quads::GetIndexCount(count); diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/maxwell_3d.h b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/maxwell_3d.h index 52ae22f9..b98b215a 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/maxwell_3d.h +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/maxwell_3d.h @@ -4,10 +4,10 @@ #pragma once #include +#include #include "common.h" #include "active_state.h" #include "constant_buffers.h" -#include "samplers.h" #include "textures.h" namespace skyline::gpu::interconnect::maxwell3d { @@ -35,6 +35,7 @@ namespace skyline::gpu::interconnect::maxwell3d { ClearEngineRegisters clearRegisters; ConstantBufferSelectorState::EngineRegisters constantBufferSelectorRegisters; SamplerPoolState::EngineRegisters samplerPoolRegisters; + const engine::SamplerBinding &samplerBinding; TexturePoolState::EngineRegisters texturePoolRegisters; }; @@ -44,6 +45,7 @@ namespace skyline::gpu::interconnect::maxwell3d { ClearEngineRegisters clearEngineRegisters; ConstantBuffers constantBuffers; Samplers samplers; + const engine::SamplerBinding &samplerBinding; Textures textures; std::shared_ptr quadConversionBuffer{}; bool quadConversionBufferAttached{}; diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.h b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.h index 28d43ca9..ef5b7070 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.h +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/pipeline_manager.h @@ -6,10 +6,10 @@ #include #include #include +#include #include "common.h" #include "packed_pipeline_state.h" #include "constant_buffers.h" -#include "samplers.h" #include "textures.h" namespace skyline::gpu { diff --git a/app/src/main/cpp/skyline/soc/gm20b/engines/engine.h b/app/src/main/cpp/skyline/soc/gm20b/engines/engine.h index 0e4e497b..604962a7 100644 --- a/app/src/main/cpp/skyline/soc/gm20b/engines/engine.h +++ b/app/src/main/cpp/skyline/soc/gm20b/engines/engine.h @@ -47,6 +47,12 @@ namespace skyline::soc::gm20b::engine { }; static_assert(sizeof(Address) == sizeof(u64)); + struct TexSamplerPool { + Address offset; + u32 maximumIndex; + }; + static_assert(sizeof(TexSamplerPool) == sizeof(u32) * 3); + constexpr u32 EngineMethodsEnd{0xE00}; //!< All methods above this are passed to the MME on supported engines /** diff --git a/app/src/main/cpp/skyline/soc/gm20b/engines/kepler_compute.h b/app/src/main/cpp/skyline/soc/gm20b/engines/kepler_compute.h index 42cb7582..e14a5f45 100644 --- a/app/src/main/cpp/skyline/soc/gm20b/engines/kepler_compute.h +++ b/app/src/main/cpp/skyline/soc/gm20b/engines/kepler_compute.h @@ -95,8 +95,7 @@ namespace skyline::soc::gm20b::engine { Register<0x54A, u32> shaderExceptions; - Register<0x557, Address> texSamplerPool; - Register<0x559, u32> texSamplerPoolMaximumIndex; + Register<0x557, TexSamplerPool> texSamplerPool; Register<0x55D, Address> texHeaderPool; Register<0x55F, u32> texHeaderPoolMaximumIndex; diff --git a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell/types.h b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell/types.h index 25cd468d..69f85ee9 100644 --- a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell/types.h +++ b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell/types.h @@ -556,12 +556,6 @@ namespace skyline::soc::gm20b::engine::maxwell3d::type { }; static_assert(sizeof(SamplerBinding) == sizeof(u32)); - struct TexSamplerPool { - Address offset; - u32 maximumIndex; - }; - static_assert(sizeof(TexSamplerPool) == sizeof(u32) * 3); - struct TexHeaderPool { Address offset; u32 maximumIndex; 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 21972d61..0cdac2e5 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 @@ -50,7 +50,8 @@ namespace skyline::soc::gm20b::engine::maxwell3d { .activeStateRegisters = MakeActiveStateRegisters(registers), .clearRegisters = {registers.scissors[0], registers.viewportClips[0], *registers.clearRect, *registers.colorClearValue, *registers.zClearValue, *registers.stencilClearValue, *registers.surfaceClip, *registers.clearSurfaceControl}, .constantBufferSelectorRegisters = {*registers.constantBufferSelector}, - .samplerPoolRegisters = {*registers.samplerBinding, *registers.texSamplerPool, *registers.texHeaderPool}, + .samplerPoolRegisters = {*registers.texSamplerPool, *registers.texHeaderPool}, + .samplerBinding = *registers.samplerBinding, .texturePoolRegisters = {*registers.texHeaderPool} }; } 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 707f1a1e..6a05a56a 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 @@ -6,9 +6,8 @@ #pragma once #include -#include "engine.h" #include -#include "gpu/interconnect/maxwell_3d/common.h" +#include "engine.h" #include "inline2memory.h" #include "maxwell/types.h" @@ -24,7 +23,7 @@ namespace skyline::soc::gm20b::engine::maxwell3d { private: host1x::SyncpointSet &syncpoints; Inline2MemoryBackend i2m; - gpu::interconnect::maxwell3d::DirtyManager dirtyManager; + gpu::interconnect::DirtyManager dirtyManager; gpu::interconnect::maxwell3d::Maxwell3D interconnect; union BatchEnableState { @@ -267,7 +266,7 @@ namespace skyline::soc::gm20b::engine::maxwell3d { Register<0x54F, type::MultisampleControl> multisampleControl; - Register<0x557, type::TexSamplerPool> texSamplerPool; + Register<0x557, TexSamplerPool> texSamplerPool; Register<0x55B, float> slopeScaleDepthBias; Register<0x55C, u32> aliasedLineWidthEnable;