mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	glsl: Fix precise variable declaration
and add some more separation in the shader for better debugability when dumped
This commit is contained in:
		@@ -150,7 +150,7 @@ void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) {
 | 
			
		||||
    if (info.stores_clip_distance) {
 | 
			
		||||
        header += "float gl_ClipDistance[];";
 | 
			
		||||
    }
 | 
			
		||||
    header += "};";
 | 
			
		||||
    header += "};\n";
 | 
			
		||||
}
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
@@ -223,6 +223,7 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile
 | 
			
		||||
            header += declaration;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    header += "\n";
 | 
			
		||||
    DefineConstantBuffers(bindings);
 | 
			
		||||
    DefineStorageBuffers(bindings);
 | 
			
		||||
    SetupImages(bindings);
 | 
			
		||||
 
 | 
			
		||||
@@ -180,13 +180,15 @@ void DefineVariables(const EmitContext& ctx, std::string& header) {
 | 
			
		||||
        const auto type{static_cast<GlslVarType>(i)};
 | 
			
		||||
        const auto& tracker{ctx.var_alloc.GetUseTracker(type)};
 | 
			
		||||
        const auto type_name{ctx.var_alloc.GetGlslType(type)};
 | 
			
		||||
        const auto precise{
 | 
			
		||||
            (type == GlslVarType::PrecF32 || type == GlslVarType::PrecF64) ? "precise " : ""};
 | 
			
		||||
        // Temps/return types that are never used are stored at index 0
 | 
			
		||||
        if (tracker.uses_temp) {
 | 
			
		||||
            header += fmt::format("{}{}={}(0);", type_name, ctx.var_alloc.Representation(0, type),
 | 
			
		||||
                                  type_name);
 | 
			
		||||
            header += fmt::format("{}{} {}={}(0);", precise, type_name,
 | 
			
		||||
                                  ctx.var_alloc.Representation(0, type), type_name);
 | 
			
		||||
        }
 | 
			
		||||
        for (u32 index = 1; index <= tracker.num_used; ++index) {
 | 
			
		||||
            header += fmt::format("{}{}={}(0);", type_name,
 | 
			
		||||
            header += fmt::format("{}{} {}={}(0);", precise, type_name,
 | 
			
		||||
                                  ctx.var_alloc.Representation(index, type), type_name);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -198,7 +200,7 @@ std::string EmitGLSL(const Profile& profile, const RuntimeInfo& runtime_info, IR
 | 
			
		||||
    EmitContext ctx{program, bindings, profile, runtime_info};
 | 
			
		||||
    Precolor(program);
 | 
			
		||||
    EmitCode(ctx, program);
 | 
			
		||||
    const std::string version{fmt::format("#version 450{}\n", GlslVersionSpecifier(ctx))};
 | 
			
		||||
    const std::string version{fmt::format("#version 460{}\n", GlslVersionSpecifier(ctx))};
 | 
			
		||||
    ctx.header.insert(0, version);
 | 
			
		||||
    if (program.local_memory_size > 0) {
 | 
			
		||||
        ctx.header += fmt::format("uint lmem[{}];", program.local_memory_size / 4);
 | 
			
		||||
@@ -206,7 +208,7 @@ std::string EmitGLSL(const Profile& profile, const RuntimeInfo& runtime_info, IR
 | 
			
		||||
    if (program.shared_memory_size > 0) {
 | 
			
		||||
        ctx.header += fmt::format("shared uint smem[{}];", program.shared_memory_size / 4);
 | 
			
		||||
    }
 | 
			
		||||
    ctx.header += "void main(){\n";
 | 
			
		||||
    ctx.header += "\nvoid main(){\n";
 | 
			
		||||
    if (program.stage == Stage::VertexA || program.stage == Stage::VertexB) {
 | 
			
		||||
        ctx.header += "gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);";
 | 
			
		||||
        // TODO: Properly resolve attribute issues
 | 
			
		||||
 
 | 
			
		||||
@@ -202,37 +202,35 @@ GlslVarType VarAlloc::RegType(IR::Type type) const {
 | 
			
		||||
std::string VarAlloc::GetGlslType(GlslVarType type) const {
 | 
			
		||||
    switch (type) {
 | 
			
		||||
    case GlslVarType::U1:
 | 
			
		||||
        return "bool ";
 | 
			
		||||
        return "bool";
 | 
			
		||||
    case GlslVarType::F16x2:
 | 
			
		||||
        return "f16vec2 ";
 | 
			
		||||
        return "f16vec2";
 | 
			
		||||
    case GlslVarType::U32:
 | 
			
		||||
        return "uint ";
 | 
			
		||||
        return "uint";
 | 
			
		||||
    case GlslVarType::S32:
 | 
			
		||||
        return "int ";
 | 
			
		||||
        return "int";
 | 
			
		||||
    case GlslVarType::F32:
 | 
			
		||||
        return "float ";
 | 
			
		||||
    case GlslVarType::S64:
 | 
			
		||||
        return "int64_t ";
 | 
			
		||||
    case GlslVarType::U64:
 | 
			
		||||
        return "uint64_t ";
 | 
			
		||||
    case GlslVarType::F64:
 | 
			
		||||
        return "double ";
 | 
			
		||||
    case GlslVarType::U32x2:
 | 
			
		||||
        return "uvec2 ";
 | 
			
		||||
    case GlslVarType::F32x2:
 | 
			
		||||
        return "vec2 ";
 | 
			
		||||
    case GlslVarType::U32x3:
 | 
			
		||||
        return "uvec3 ";
 | 
			
		||||
    case GlslVarType::F32x3:
 | 
			
		||||
        return "vec3 ";
 | 
			
		||||
    case GlslVarType::U32x4:
 | 
			
		||||
        return "uvec4 ";
 | 
			
		||||
    case GlslVarType::F32x4:
 | 
			
		||||
        return "vec4 ";
 | 
			
		||||
    case GlslVarType::PrecF32:
 | 
			
		||||
        return "precise float ";
 | 
			
		||||
        return "float";
 | 
			
		||||
    case GlslVarType::S64:
 | 
			
		||||
        return "int64_t";
 | 
			
		||||
    case GlslVarType::U64:
 | 
			
		||||
        return "uint64_t";
 | 
			
		||||
    case GlslVarType::F64:
 | 
			
		||||
    case GlslVarType::PrecF64:
 | 
			
		||||
        return "precise double ";
 | 
			
		||||
        return "double";
 | 
			
		||||
    case GlslVarType::U32x2:
 | 
			
		||||
        return "uvec2";
 | 
			
		||||
    case GlslVarType::F32x2:
 | 
			
		||||
        return "vec2";
 | 
			
		||||
    case GlslVarType::U32x3:
 | 
			
		||||
        return "uvec3";
 | 
			
		||||
    case GlslVarType::F32x3:
 | 
			
		||||
        return "vec3";
 | 
			
		||||
    case GlslVarType::U32x4:
 | 
			
		||||
        return "uvec4";
 | 
			
		||||
    case GlslVarType::F32x4:
 | 
			
		||||
        return "vec4";
 | 
			
		||||
    case GlslVarType::Void:
 | 
			
		||||
        return "";
 | 
			
		||||
    default:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user