mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	gl_shader_decompiler: Avoid writing output attribute when unimplemented
This commit is contained in:
		@@ -984,10 +984,10 @@ private:
 | 
				
			|||||||
        return {std::move(temporary), value.GetType()};
 | 
					        return {std::move(temporary), value.GetType()};
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Expression GetOutputAttribute(const AbufNode* abuf) {
 | 
					    std::optional<Expression> GetOutputAttribute(const AbufNode* abuf) {
 | 
				
			||||||
        switch (const auto attribute = abuf->GetIndex()) {
 | 
					        switch (const auto attribute = abuf->GetIndex()) {
 | 
				
			||||||
        case Attribute::Index::Position:
 | 
					        case Attribute::Index::Position:
 | 
				
			||||||
            return {"gl_Position"s + GetSwizzle(abuf->GetElement()), Type::Float};
 | 
					            return {{"gl_Position"s + GetSwizzle(abuf->GetElement()), Type::Float}};
 | 
				
			||||||
        case Attribute::Index::LayerViewportPointSize:
 | 
					        case Attribute::Index::LayerViewportPointSize:
 | 
				
			||||||
            switch (abuf->GetElement()) {
 | 
					            switch (abuf->GetElement()) {
 | 
				
			||||||
            case 0:
 | 
					            case 0:
 | 
				
			||||||
@@ -997,25 +997,25 @@ private:
 | 
				
			|||||||
                if (IsVertexShader(stage) && !device.HasVertexViewportLayer()) {
 | 
					                if (IsVertexShader(stage) && !device.HasVertexViewportLayer()) {
 | 
				
			||||||
                    return {};
 | 
					                    return {};
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return {"gl_Layer", Type::Int};
 | 
					                return {{"gl_Layer", Type::Int}};
 | 
				
			||||||
            case 2:
 | 
					            case 2:
 | 
				
			||||||
                if (IsVertexShader(stage) && !device.HasVertexViewportLayer()) {
 | 
					                if (IsVertexShader(stage) && !device.HasVertexViewportLayer()) {
 | 
				
			||||||
                    return {};
 | 
					                    return {};
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return {"gl_ViewportIndex", Type::Int};
 | 
					                return {{"gl_ViewportIndex", Type::Int}};
 | 
				
			||||||
            case 3:
 | 
					            case 3:
 | 
				
			||||||
                UNIMPLEMENTED_MSG("Requires some state changes for gl_PointSize to work in shader");
 | 
					                UNIMPLEMENTED_MSG("Requires some state changes for gl_PointSize to work in shader");
 | 
				
			||||||
                return {"gl_PointSize", Type::Float};
 | 
					                return {{"gl_PointSize", Type::Float}};
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return {};
 | 
					            return {};
 | 
				
			||||||
        case Attribute::Index::ClipDistances0123:
 | 
					        case Attribute::Index::ClipDistances0123:
 | 
				
			||||||
            return {fmt::format("gl_ClipDistance[{}]", abuf->GetElement()), Type::Float};
 | 
					            return {{fmt::format("gl_ClipDistance[{}]", abuf->GetElement()), Type::Float}};
 | 
				
			||||||
        case Attribute::Index::ClipDistances4567:
 | 
					        case Attribute::Index::ClipDistances4567:
 | 
				
			||||||
            return {fmt::format("gl_ClipDistance[{}]", abuf->GetElement() + 4), Type::Float};
 | 
					            return {{fmt::format("gl_ClipDistance[{}]", abuf->GetElement() + 4), Type::Float}};
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            if (IsGenericAttribute(attribute)) {
 | 
					            if (IsGenericAttribute(attribute)) {
 | 
				
			||||||
                return {GetOutputAttribute(attribute) + GetSwizzle(abuf->GetElement()),
 | 
					                return {
 | 
				
			||||||
                        Type::Float};
 | 
					                    {GetOutputAttribute(attribute) + GetSwizzle(abuf->GetElement()), Type::Float}};
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            UNIMPLEMENTED_MSG("Unhandled output attribute: {}", static_cast<u32>(attribute));
 | 
					            UNIMPLEMENTED_MSG("Unhandled output attribute: {}", static_cast<u32>(attribute));
 | 
				
			||||||
            return {};
 | 
					            return {};
 | 
				
			||||||
@@ -1187,7 +1187,11 @@ private:
 | 
				
			|||||||
            target = {GetRegister(gpr->GetIndex()), Type::Float};
 | 
					            target = {GetRegister(gpr->GetIndex()), Type::Float};
 | 
				
			||||||
        } else if (const auto abuf = std::get_if<AbufNode>(&*dest)) {
 | 
					        } else if (const auto abuf = std::get_if<AbufNode>(&*dest)) {
 | 
				
			||||||
            UNIMPLEMENTED_IF(abuf->IsPhysicalBuffer());
 | 
					            UNIMPLEMENTED_IF(abuf->IsPhysicalBuffer());
 | 
				
			||||||
            target = GetOutputAttribute(abuf);
 | 
					            auto output = GetOutputAttribute(abuf);
 | 
				
			||||||
 | 
					            if (!output) {
 | 
				
			||||||
 | 
					                return {};
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            target = std::move(*output);
 | 
				
			||||||
        } else if (const auto lmem = std::get_if<LmemNode>(&*dest)) {
 | 
					        } else if (const auto lmem = std::get_if<LmemNode>(&*dest)) {
 | 
				
			||||||
            if (stage == ProgramType::Compute) {
 | 
					            if (stage == ProgramType::Compute) {
 | 
				
			||||||
                LOG_WARNING(Render_OpenGL, "Local memory is stubbed on compute shaders");
 | 
					                LOG_WARNING(Render_OpenGL, "Local memory is stubbed on compute shaders");
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user