glsl: Add stubs for sparse queries and variable aoffi when not supported
This commit is contained in:
		| @@ -384,7 +384,7 @@ void EmitContext::SetupExtensions() { | ||||
|         profile.support_viewport_index_layer_non_geometry && stage != Stage::Geometry) { | ||||
|         header += "#extension GL_ARB_shader_viewport_layer_array : enable\n"; | ||||
|     } | ||||
|     if (info.uses_sparse_residency) { | ||||
|     if (info.uses_sparse_residency && profile.support_gl_sparse_textures) { | ||||
|         header += "#extension GL_ARB_sparse_texture2 : enable\n"; | ||||
|     } | ||||
|     if (info.stores_viewport_mask && profile.support_viewport_mask) { | ||||
|   | ||||
| @@ -215,7 +215,7 @@ std::string EmitGLSL(const Profile& profile, const RuntimeInfo& runtime_info, IR | ||||
|         ctx.header += | ||||
|             fmt::format("shared uint smem[{}];", Common::AlignUp(program.shared_memory_size, 4)); | ||||
|     } | ||||
|     ctx.header += "\nvoid main(){\n"; | ||||
|     ctx.header += "void 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 | ||||
|   | ||||
| @@ -94,7 +94,11 @@ std::string GetOffsetVec(EmitContext& ctx, const IR::Value& offset) { | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|     const auto offset_str{ctx.var_alloc.Consume(offset)}; | ||||
|     const bool has_var_aoffi{ctx.profile.support_gl_variable_aoffi}; | ||||
|     if (!has_var_aoffi) { | ||||
|         // LOG_WARNING("Device does not support variable texture offsets, STUBBING"); | ||||
|     } | ||||
|     const auto offset_str{has_var_aoffi ? ctx.var_alloc.Consume(offset) : "0"}; | ||||
|     switch (offset.Type()) { | ||||
|     case IR::Type::U32: | ||||
|         return fmt::format("int({})", offset_str); | ||||
| @@ -146,7 +150,12 @@ void EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst& inst, const IR::Valu | ||||
|     const auto bias{info.has_bias ? fmt::format(",{}", bias_lc) : ""}; | ||||
|     const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)}; | ||||
|     const auto sparse_inst{PrepareSparse(inst)}; | ||||
|     if (!sparse_inst) { | ||||
|     const bool supports_sparse{ctx.profile.support_gl_sparse_textures}; | ||||
|     if (sparse_inst && !supports_sparse) { | ||||
|         // LOG_WARNING(..., "Device does not support sparse texture queries. STUBBING"); | ||||
|         ctx.AddU1("{}=true;", *sparse_inst); | ||||
|     } | ||||
|     if (!sparse_inst || !supports_sparse) { | ||||
|         if (!offset.IsEmpty()) { | ||||
|             const auto offset_str{GetOffsetVec(ctx, offset)}; | ||||
|             if (ctx.stage == Stage::Fragment) { | ||||
| @@ -163,7 +172,6 @@ void EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst& inst, const IR::Valu | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
|     // TODO: Query sparseTexels extension support | ||||
|     if (!offset.IsEmpty()) { | ||||
|         ctx.AddU1("{}=sparseTexelsResidentARB(sparseTextureOffsetARB({},{},{},{}{}));", | ||||
|                   *sparse_inst, texture, coords, GetOffsetVec(ctx, offset), texel, bias); | ||||
| @@ -186,7 +194,12 @@ void EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst& inst, const IR::Valu | ||||
|     const auto texture{Texture(ctx, info, index)}; | ||||
|     const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)}; | ||||
|     const auto sparse_inst{PrepareSparse(inst)}; | ||||
|     if (!sparse_inst) { | ||||
|     const bool supports_sparse{ctx.profile.support_gl_sparse_textures}; | ||||
|     if (sparse_inst && !supports_sparse) { | ||||
|         // LOG_WARNING(..., "Device does not support sparse texture queries. STUBBING"); | ||||
|         ctx.AddU1("{}=true;", *sparse_inst); | ||||
|     } | ||||
|     if (!sparse_inst || !supports_sparse) { | ||||
|         if (!offset.IsEmpty()) { | ||||
|             ctx.Add("{}=textureLodOffset({},{},{},{});", texel, texture, coords, lod_lc, | ||||
|                     GetOffsetVec(ctx, offset)); | ||||
| @@ -195,7 +208,6 @@ void EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst& inst, const IR::Valu | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
|     // TODO: Query sparseTexels extension support | ||||
|     if (!offset.IsEmpty()) { | ||||
|         ctx.AddU1("{}=sparseTexelsResidentARB(sparseTexelFetchOffsetARB({},{},int({}),{},{}));", | ||||
|                   *sparse_inst, texture, CastToIntVec(coords, info), lod_lc, | ||||
| @@ -315,7 +327,12 @@ void EmitImageGather(EmitContext& ctx, IR::Inst& inst, const IR::Value& index, | ||||
|     const auto texture{Texture(ctx, info, index)}; | ||||
|     const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)}; | ||||
|     const auto sparse_inst{PrepareSparse(inst)}; | ||||
|     if (!sparse_inst) { | ||||
|     const bool supports_sparse{ctx.profile.support_gl_sparse_textures}; | ||||
|     if (sparse_inst && !supports_sparse) { | ||||
|         // LOG_WARNING(..., "Device does not support sparse texture queries. STUBBING"); | ||||
|         ctx.AddU1("{}=true;", *sparse_inst); | ||||
|     } | ||||
|     if (!sparse_inst || !supports_sparse) { | ||||
|         if (offset.IsEmpty()) { | ||||
|             ctx.Add("{}=textureGather({},{},int({}));", texel, texture, coords, | ||||
|                     info.gather_component); | ||||
| @@ -332,7 +349,6 @@ void EmitImageGather(EmitContext& ctx, IR::Inst& inst, const IR::Value& index, | ||||
|                 info.gather_component); | ||||
|         return; | ||||
|     } | ||||
|     // TODO: Query sparseTexels extension support | ||||
|     if (offset.IsEmpty()) { | ||||
|         ctx.AddU1("{}=sparseTexelsResidentARB(sparseTextureGatherARB({},{},{},int({})));", | ||||
|                   *sparse_inst, texture, coords, texel, info.gather_component); | ||||
| @@ -358,7 +374,12 @@ void EmitImageGatherDref(EmitContext& ctx, IR::Inst& inst, const IR::Value& inde | ||||
|     const auto texture{Texture(ctx, info, index)}; | ||||
|     const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)}; | ||||
|     const auto sparse_inst{PrepareSparse(inst)}; | ||||
|     if (!sparse_inst) { | ||||
|     const bool supports_sparse{ctx.profile.support_gl_sparse_textures}; | ||||
|     if (sparse_inst && !supports_sparse) { | ||||
|         // LOG_WARNING(..., "Device does not support sparse texture queries. STUBBING"); | ||||
|         ctx.AddU1("{}=true;", *sparse_inst); | ||||
|     } | ||||
|     if (!sparse_inst || !supports_sparse) { | ||||
|         if (offset.IsEmpty()) { | ||||
|             ctx.Add("{}=textureGather({},{},{});", texel, texture, coords, dref); | ||||
|             return; | ||||
| @@ -373,7 +394,6 @@ void EmitImageGatherDref(EmitContext& ctx, IR::Inst& inst, const IR::Value& inde | ||||
|         ctx.Add("{}=textureGatherOffsets({},{},{},{});", texel, texture, coords, dref, offsets); | ||||
|         return; | ||||
|     } | ||||
|     // TODO: Query sparseTexels extension support | ||||
|     if (offset.IsEmpty()) { | ||||
|         ctx.AddU1("{}=sparseTexelsResidentARB(sparseTextureGatherARB({},{},{},{}));", *sparse_inst, | ||||
|                   texture, coords, dref, texel); | ||||
| @@ -404,7 +424,12 @@ void EmitImageFetch(EmitContext& ctx, IR::Inst& inst, const IR::Value& index, | ||||
|     const auto texture{Texture(ctx, info, index)}; | ||||
|     const auto sparse_inst{PrepareSparse(inst)}; | ||||
|     const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)}; | ||||
|     if (!sparse_inst) { | ||||
|     const bool supports_sparse{ctx.profile.support_gl_sparse_textures}; | ||||
|     if (sparse_inst && !supports_sparse) { | ||||
|         // LOG_WARNING(..., "Device does not support sparse texture queries. STUBBING"); | ||||
|         ctx.AddU1("{}=true;", *sparse_inst); | ||||
|     } | ||||
|     if (!sparse_inst || !supports_sparse) { | ||||
|         if (!offset.empty()) { | ||||
|             ctx.Add("{}=texelFetchOffset({},{},int({}),{});", texel, texture, | ||||
|                     CoordsCastToInt(coords, info), lod, CoordsCastToInt(offset, info)); | ||||
| @@ -418,7 +443,6 @@ void EmitImageFetch(EmitContext& ctx, IR::Inst& inst, const IR::Value& index, | ||||
|         } | ||||
|         return; | ||||
|     } | ||||
|     // TODO: Query sparseTexels extension support | ||||
|     if (!offset.empty()) { | ||||
|         ctx.AddU1("{}=sparseTexelsResidentARB(sparseTexelFetchOffsetARB({},{},int({}),{},{}));", | ||||
|                   *sparse_inst, texture, CastToIntVec(coords, info), lod, | ||||
|   | ||||
| @@ -87,6 +87,8 @@ struct Profile { | ||||
|     bool support_gl_amd_gpu_shader_half_float{}; | ||||
|     bool support_gl_texture_shadow_lod{}; | ||||
|     bool support_gl_warp_intrinsics{}; | ||||
|     bool support_gl_variable_aoffi{}; | ||||
|     bool support_gl_sparse_textures{}; | ||||
|  | ||||
|     bool warp_size_potentially_larger_than_guest{}; | ||||
|  | ||||
|   | ||||
| @@ -160,6 +160,7 @@ Device::Device() { | ||||
|     has_depth_buffer_float = HasExtension(extensions, "GL_NV_depth_buffer_float"); | ||||
|     has_nv_gpu_shader_5 = GLAD_GL_NV_gpu_shader5; | ||||
|     has_amd_shader_half_float = GLAD_GL_AMD_gpu_shader_half_float; | ||||
|     has_sparse_texture_2 = GLAD_GL_ARB_sparse_texture2; | ||||
|     warp_size_potentially_larger_than_guest = !is_nvidia && !is_intel; | ||||
|  | ||||
|     // At the moment of writing this, only Nvidia's driver optimizes BufferSubData on exclusive | ||||
|   | ||||
| @@ -128,6 +128,10 @@ public: | ||||
|         return has_amd_shader_half_float; | ||||
|     } | ||||
|  | ||||
|     bool HasSparseTexture2() const { | ||||
|         return has_sparse_texture_2; | ||||
|     } | ||||
|  | ||||
|     bool IsWarpSizePotentiallyLargerThanGuest() const { | ||||
|         return warp_size_potentially_larger_than_guest; | ||||
|     } | ||||
| @@ -165,6 +169,7 @@ private: | ||||
|     bool has_depth_buffer_float{}; | ||||
|     bool has_nv_gpu_shader_5{}; | ||||
|     bool has_amd_shader_half_float{}; | ||||
|     bool has_sparse_texture_2{}; | ||||
|     bool warp_size_potentially_larger_than_guest{}; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -193,6 +193,8 @@ ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindo | ||||
|           .support_gl_amd_gpu_shader_half_float = device.HasAmdShaderHalfFloat(), | ||||
|           .support_gl_texture_shadow_lod = device.HasTextureShadowLod(), | ||||
|           .support_gl_warp_intrinsics = false, | ||||
|           .support_gl_variable_aoffi = device.HasVariableAoffi(), | ||||
|           .support_gl_sparse_textures = device.HasSparseTexture2(), | ||||
|  | ||||
|           .warp_size_potentially_larger_than_guest = device.IsWarpSizePotentiallyLargerThanGuest(), | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user