diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp index 3617c7c0..91558c3b 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSL.cpp @@ -2193,7 +2193,7 @@ static void _emitTEXSampleTextureCode(LatteDecompilerShaderContext* shaderContex src->add("."); const char* resultElemTable[4] = {"x","y","z","w"}; sint32 numWrittenElements = 0; - for(sint32 f=0; f<4; f++) + for(sint32 f = 0; f < 4; f++) { if( texInstruction->dstSel[f] < 4 ) { @@ -2493,18 +2493,21 @@ static void _emitTEXSampleTextureCode(LatteDecompilerShaderContext* shaderContex // lod bias if( texOpcode == GPU7_TEX_INST_SAMPLE_C || texOpcode == GPU7_TEX_INST_SAMPLE_C_LZ ) { - src->add(")"); + src->add(")."); if (numWrittenElements > 1) { // result is copied into multiple channels - src->add("."); for (sint32 f = 0; f < numWrittenElements; f++) { cemu_assert_debug(texInstruction->dstSel[f] == 0); // only x component is defined src->add("x"); } } + else + { + src->add("x"); + } } else { diff --git a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLHeader.hpp b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLHeader.hpp index e62a7d1c..b3380d31 100644 --- a/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLHeader.hpp +++ b/src/Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompilerEmitMSLHeader.hpp @@ -6,7 +6,6 @@ namespace LatteDecompiler { auto src = decompilerContext->shaderSource; - LatteDecompilerShaderResourceMapping& resourceMapping = decompilerContext->output->resourceMappingGL; auto& uniformOffsets = decompilerContext->output->uniformOffsetsVK; src->add("struct SupportBuffer {" _CRLF); @@ -129,11 +128,8 @@ namespace LatteDecompiler if (!decompilerContext->analyzer.uniformBufferAccessTracker[i].HasAccess()) continue; - cemu_assert_debug(decompilerContext->output->resourceMappingGL.uniformBuffersBindingPoint[i] >= 0); cemu_assert_debug(decompilerContext->output->resourceMappingVK.uniformBuffersBindingPoint[i] >= 0); - //shaderSrc->addFmt("UNIFORM_BUFFER_LAYOUT({}, {}, {}) ", (sint32)decompilerContext->output->resourceMappingGL.uniformBuffersBindingPoint[i], (sint32)decompilerContext->output->resourceMappingVK.setIndex, (sint32)decompilerContext->output->resourceMappingVK.uniformBuffersBindingPoint[i]); - shaderSrc->addFmt("struct UBuff{} {{" _CRLF, i); shaderSrc->addFmt("float4 d[{}];" _CRLF, decompilerContext->analyzer.uniformBufferAccessTracker[i].DetermineSize(decompilerContext->shaderBaseHash, LATTE_GLSL_DYNAMIC_UNIFORM_BLOCK_SIZE)); shaderSrc->add("};" _CRLF _CRLF); @@ -169,9 +165,7 @@ namespace LatteDecompiler { if (decompilerContext->analyzer.inputAttributSemanticMask[i]) { - cemu_assert_debug(decompilerContext->output->resourceMappingGL.attributeMapping[i] >= 0); cemu_assert_debug(decompilerContext->output->resourceMappingVK.attributeMapping[i] >= 0); - cemu_assert_debug(decompilerContext->output->resourceMappingGL.attributeMapping[i] == decompilerContext->output->resourceMappingVK.attributeMapping[i]); src->addFmt("uint4 attrDataSem{} [[attribute({})]];" _CRLF, i, (sint32)decompilerContext->output->resourceMappingVK.attributeMapping[i]); } @@ -304,10 +298,9 @@ namespace LatteDecompiler if (!decompilerContext->analyzer.uniformBufferAccessTracker[i].HasAccess()) continue; - cemu_assert_debug(decompilerContext->output->resourceMappingGL.uniformBuffersBindingPoint[i] >= 0); cemu_assert_debug(decompilerContext->output->resourceMappingVK.uniformBuffersBindingPoint[i] >= 0); - src->addFmt(", constant UBuff{}& ubuff{} [[buffer({})]]", i, i, (sint32)decompilerContext->output->resourceMappingGL.uniformBuffersBindingPoint[i]); + src->addFmt(", constant UBuff{}& ubuff{} [[buffer({})]]", i, i, (sint32)decompilerContext->output->resourceMappingVK.uniformBuffersBindingPoint[i]); } } } @@ -348,11 +341,11 @@ namespace LatteDecompiler cemu_assert_unimplemented(); } - // HACK - uint32 textureBinding = shaderContext->output->resourceMappingGL.textureUnitToBindingPoint[i] % 31; - uint32 samplerBinding = textureBinding % 16; - src->addFmt(" tex{} [[texture({})]]", i, textureBinding); - src->addFmt(", sampler samplr{} [[sampler({})]]", i, samplerBinding); + uint32 binding = shaderContext->output->resourceMappingVK.textureUnitToBindingPoint[i]; + //uint32 textureBinding = shaderContext->output->resourceMappingVK.textureUnitToBindingPoint[i] % 31; + //uint32 samplerBinding = textureBinding % 16; + src->addFmt(" tex{} [[texture({})]]", i, binding); + src->addFmt(", sampler samplr{} [[sampler({})]]", i, binding); } } diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp index ad1ce126..2a3707b6 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp @@ -107,9 +107,10 @@ void MetalRenderer::Shutdown() CommitCommandBuffer(); } +// TODO: what should this do? bool MetalRenderer::IsPadWindowActive() { - debug_printf("MetalRenderer::IsPadWindowActive not implemented\n"); + //debug_printf("MetalRenderer::IsPadWindowActive not implemented\n"); return false; } @@ -805,6 +806,23 @@ void MetalRenderer::BindStageResources(MTL::RenderCommandEncoder* renderCommandE auto hostTextureUnit = relative_textureUnit; auto textureDim = shader->textureUnitDim[relative_textureUnit]; auto texUnitRegIndex = hostTextureUnit * 7; + switch (shader->shaderType) + { + case LatteConst::ShaderType::Vertex: + hostTextureUnit += LATTE_CEMU_VS_TEX_UNIT_BASE; + texUnitRegIndex += Latte::REGADDR::SQ_TEX_RESOURCE_WORD0_N_VS; + break; + case LatteConst::ShaderType::Pixel: + hostTextureUnit += LATTE_CEMU_PS_TEX_UNIT_BASE; + texUnitRegIndex += Latte::REGADDR::SQ_TEX_RESOURCE_WORD0_N_PS; + break; + case LatteConst::ShaderType::Geometry: + hostTextureUnit += LATTE_CEMU_GS_TEX_UNIT_BASE; + texUnitRegIndex += Latte::REGADDR::SQ_TEX_RESOURCE_WORD0_N_GS; + break; + default: + UNREACHABLE; + } auto textureView = m_state.textures[hostTextureUnit]; if (!textureView) @@ -821,9 +839,15 @@ void MetalRenderer::BindStageResources(MTL::RenderCommandEncoder* renderCommandE //auto imageViewObj = textureView->GetSamplerView(word4); //info.imageView = imageViewObj->m_textureImageView; - // HACK - uint32 textureBinding = (shader->resourceMapping.getTextureBaseBindingPoint() + i) % MAX_MTL_TEXTURES; - uint32 samplerBinding = textureBinding % MAX_MTL_SAMPLERS; + // TODO: uncomment + uint32 binding = shader->resourceMapping.getTextureBaseBindingPoint() + i;//shader->resourceMapping.textureUnitToBindingPoint[hostTextureUnit]; + //uint32 textureBinding = binding % MAX_MTL_TEXTURES; + //uint32 samplerBinding = binding % MAX_MTL_SAMPLERS; + if (binding >= MAX_MTL_TEXTURES) + { + debug_printf("invalid texture binding %u\n", binding); + continue; + } uint32 stageSamplerIndex = shader->textureUnitSamplerAssignment[relative_textureUnit]; if (stageSamplerIndex != LATTE_DECOMPILER_SAMPLER_NONE) @@ -934,12 +958,12 @@ void MetalRenderer::BindStageResources(MTL::RenderCommandEncoder* renderCommandE { case LatteConst::ShaderType::Vertex: { - renderCommandEncoder->setVertexSamplerState(sampler, samplerBinding); + renderCommandEncoder->setVertexSamplerState(sampler, binding); break; } case LatteConst::ShaderType::Pixel: { - renderCommandEncoder->setFragmentSamplerState(sampler, samplerBinding); + renderCommandEncoder->setFragmentSamplerState(sampler, binding); break; } default: @@ -952,12 +976,12 @@ void MetalRenderer::BindStageResources(MTL::RenderCommandEncoder* renderCommandE { case LatteConst::ShaderType::Vertex: { - renderCommandEncoder->setVertexTexture(textureView->GetTexture(), textureBinding); + renderCommandEncoder->setVertexTexture(textureView->GetTexture(), binding); break; } case LatteConst::ShaderType::Pixel: { - renderCommandEncoder->setFragmentTexture(textureView->GetTexture(), textureBinding); + renderCommandEncoder->setFragmentTexture(textureView->GetTexture(), binding); break; } default: