mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	glsl: skip gl_ViewportIndex write if device does not support it
This commit is contained in:
		@@ -148,23 +148,24 @@ std::string_view OutputPrimitive(OutputTopology topology) {
 | 
			
		||||
    throw InvalidArgument("Invalid output topology {}", topology);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) {
 | 
			
		||||
    if (!StoresPerVertexAttributes(stage)) {
 | 
			
		||||
void SetupOutPerVertex(EmitContext& ctx, std::string& header) {
 | 
			
		||||
    if (!StoresPerVertexAttributes(ctx.stage)) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    header += "out gl_PerVertex{";
 | 
			
		||||
    header += "vec4 gl_Position;";
 | 
			
		||||
    if (info.stores_point_size) {
 | 
			
		||||
    if (ctx.info.stores_point_size) {
 | 
			
		||||
        header += "float gl_PointSize;";
 | 
			
		||||
    }
 | 
			
		||||
    if (info.stores_clip_distance) {
 | 
			
		||||
    if (ctx.info.stores_clip_distance) {
 | 
			
		||||
        header += "float gl_ClipDistance[];";
 | 
			
		||||
    }
 | 
			
		||||
    if (info.stores_viewport_index && stage != Stage::Geometry) {
 | 
			
		||||
    if (ctx.info.stores_viewport_index && ctx.supports_viewport_layer &&
 | 
			
		||||
        ctx.stage != Stage::Geometry) {
 | 
			
		||||
        header += "int gl_ViewportIndex;";
 | 
			
		||||
    }
 | 
			
		||||
    header += "};\n";
 | 
			
		||||
    if (info.stores_viewport_index && stage == Stage::Geometry) {
 | 
			
		||||
    if (ctx.info.stores_viewport_index && ctx.stage == Stage::Geometry) {
 | 
			
		||||
        header += "out int gl_ViewportIndex;";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -173,6 +174,7 @@ void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) {
 | 
			
		||||
EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile& profile_,
 | 
			
		||||
                         const RuntimeInfo& runtime_info_)
 | 
			
		||||
    : info{program.info}, profile{profile_}, runtime_info{runtime_info_} {
 | 
			
		||||
    supports_viewport_layer = profile.support_gl_vertex_viewport_layer;
 | 
			
		||||
    SetupExtensions(header);
 | 
			
		||||
    stage = program.stage;
 | 
			
		||||
    switch (program.stage) {
 | 
			
		||||
@@ -206,7 +208,7 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile
 | 
			
		||||
                              program.workgroup_size[2]);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    SetupOutPerVertex(stage, info, header);
 | 
			
		||||
    SetupOutPerVertex(*this, header);
 | 
			
		||||
    for (size_t index = 0; index < info.input_generics.size(); ++index) {
 | 
			
		||||
        const auto& generic{info.input_generics[index]};
 | 
			
		||||
        if (generic.used) {
 | 
			
		||||
@@ -276,7 +278,7 @@ void EmitContext::SetupExtensions(std::string&) {
 | 
			
		||||
            header += "#extension GL_ARB_gpu_shader_int64 : enable\n";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (info.stores_viewport_index && stage != Stage::Geometry) {
 | 
			
		||||
    if (info.stores_viewport_index && supports_viewport_layer && stage != Stage::Geometry) {
 | 
			
		||||
        header += "#extension GL_ARB_shader_viewport_layer_array : enable\n";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -159,6 +159,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    bool uses_y_direction{};
 | 
			
		||||
    bool uses_cc_carry{};
 | 
			
		||||
    bool supports_viewport_layer{};
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    void SetupExtensions(std::string& header);
 | 
			
		||||
 
 | 
			
		||||
@@ -226,6 +226,11 @@ void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, std::string_view val
 | 
			
		||||
        ctx.Add("gl_Position.{}={};", swizzle, value);
 | 
			
		||||
        break;
 | 
			
		||||
    case IR::Attribute::ViewportIndex:
 | 
			
		||||
        if (ctx.stage != Stage::Geometry && !ctx.supports_viewport_layer) {
 | 
			
		||||
            // LOG_WARNING(..., "Shader stores viewport index but device does not support viewport
 | 
			
		||||
            // layer extension");
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        ctx.Add("gl_ViewportIndex=floatBitsToInt({});", value);
 | 
			
		||||
        break;
 | 
			
		||||
    case IR::Attribute::ClipDistance0:
 | 
			
		||||
 
 | 
			
		||||
@@ -85,6 +85,7 @@ struct Profile {
 | 
			
		||||
    bool support_derivative_control{};
 | 
			
		||||
    bool support_gl_nv_gpu_shader_5{};
 | 
			
		||||
    bool support_gl_amd_gpu_shader_half_float{};
 | 
			
		||||
    bool support_gl_vertex_viewport_layer{};
 | 
			
		||||
 | 
			
		||||
    bool warp_size_potentially_larger_than_guest{};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -225,6 +225,7 @@ ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindo
 | 
			
		||||
          .support_derivative_control = device.HasDerivativeControl(),
 | 
			
		||||
          .support_gl_nv_gpu_shader_5 = device.HasNvGpuShader5(),
 | 
			
		||||
          .support_gl_amd_gpu_shader_half_float = device.HasAmdShaderHalfFloat(),
 | 
			
		||||
          .support_gl_vertex_viewport_layer = device.HasVertexViewportLayer(),
 | 
			
		||||
 | 
			
		||||
          .warp_size_potentially_larger_than_guest = device.IsWarpSizePotentiallyLargerThanGuest(),
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user