gl_shader_decompiler: Allow vertex position to be used in fragment shader.
This commit is contained in:
		@@ -156,23 +156,27 @@ private:
 | 
			
		||||
 | 
			
		||||
    /// Generates code representing an input attribute register.
 | 
			
		||||
    std::string GetInputAttribute(Attribute::Index attribute) {
 | 
			
		||||
        declr_input_attribute.insert(attribute);
 | 
			
		||||
        switch (attribute) {
 | 
			
		||||
        case Attribute::Index::Position:
 | 
			
		||||
            return "position";
 | 
			
		||||
        default:
 | 
			
		||||
            const u32 index{static_cast<u32>(attribute) -
 | 
			
		||||
                            static_cast<u32>(Attribute::Index::Attribute_0)};
 | 
			
		||||
            if (attribute >= Attribute::Index::Attribute_0) {
 | 
			
		||||
                declr_input_attribute.insert(attribute);
 | 
			
		||||
                return "input_attribute_" + std::to_string(index);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        const u32 index{static_cast<u32>(attribute) -
 | 
			
		||||
                        static_cast<u32>(Attribute::Index::Attribute_0)};
 | 
			
		||||
        if (attribute >= Attribute::Index::Attribute_0) {
 | 
			
		||||
            return "input_attribute_" + std::to_string(index);
 | 
			
		||||
            LOG_CRITICAL(HW_GPU, "Unhandled input attribute: 0x%02x", index);
 | 
			
		||||
            UNREACHABLE();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        LOG_CRITICAL(HW_GPU, "Unhandled input attribute: 0x%02x", index);
 | 
			
		||||
        UNREACHABLE();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Generates code representing an output attribute register.
 | 
			
		||||
    std::string GetOutputAttribute(Attribute::Index attribute) {
 | 
			
		||||
        switch (attribute) {
 | 
			
		||||
        case Attribute::Index::Position:
 | 
			
		||||
            return "gl_Position";
 | 
			
		||||
            return "position";
 | 
			
		||||
        default:
 | 
			
		||||
            const u32 index{static_cast<u32>(attribute) -
 | 
			
		||||
                            static_cast<u32>(Attribute::Index::Attribute_0)};
 | 
			
		||||
@@ -381,12 +385,6 @@ private:
 | 
			
		||||
            }
 | 
			
		||||
            case OpCode::Id::IPA: {
 | 
			
		||||
                const auto& attribute = instr.attribute.fmt28;
 | 
			
		||||
 | 
			
		||||
                if (attribute.index == Attribute::Index::Position) {
 | 
			
		||||
                    LOG_CRITICAL(HW_GPU, "Unimplemented");
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                std::string dest = GetRegister(instr.gpr0);
 | 
			
		||||
                SetDest(attribute.element, dest, GetInputAttribute(attribute.index), 1, 4);
 | 
			
		||||
                break;
 | 
			
		||||
 
 | 
			
		||||
@@ -27,10 +27,13 @@ out gl_PerVertex {
 | 
			
		||||
    vec4 gl_Position;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
out vec4 position;
 | 
			
		||||
 | 
			
		||||
void main() {
 | 
			
		||||
    exec_shader();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    gl_Position = position;
 | 
			
		||||
}
 | 
			
		||||
)";
 | 
			
		||||
    out += program.first;
 | 
			
		||||
    return {out, program.second};
 | 
			
		||||
@@ -46,6 +49,7 @@ ProgramResult GenerateFragmentShader(const ShaderSetup& setup, const MaxwellFSCo
 | 
			
		||||
                                .get_value_or({});
 | 
			
		||||
    out += R"(
 | 
			
		||||
 | 
			
		||||
in vec4 position;
 | 
			
		||||
out vec4 color;
 | 
			
		||||
 | 
			
		||||
uniform sampler2D tex[32];
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user