mirror of
https://github.com/yuzu-mirror/yuzu
synced 2024-12-23 20:33:05 +00:00
glsl: Add stubs for sparse queries and variable aoffi when not supported
This commit is contained in:
parent
6aa1bf7b6f
commit
5e7b2b9661
7 changed files with 47 additions and 13 deletions
|
@ -384,7 +384,7 @@ void EmitContext::SetupExtensions() {
|
||||||
profile.support_viewport_index_layer_non_geometry && stage != Stage::Geometry) {
|
profile.support_viewport_index_layer_non_geometry && stage != Stage::Geometry) {
|
||||||
header += "#extension GL_ARB_shader_viewport_layer_array : enable\n";
|
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";
|
header += "#extension GL_ARB_sparse_texture2 : enable\n";
|
||||||
}
|
}
|
||||||
if (info.stores_viewport_mask && profile.support_viewport_mask) {
|
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 +=
|
ctx.header +=
|
||||||
fmt::format("shared uint smem[{}];", Common::AlignUp(program.shared_memory_size, 4));
|
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) {
|
if (program.stage == Stage::VertexA || program.stage == Stage::VertexB) {
|
||||||
ctx.header += "gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);";
|
ctx.header += "gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);";
|
||||||
// TODO: Properly resolve attribute issues
|
// TODO: Properly resolve attribute issues
|
||||||
|
|
|
@ -94,7 +94,11 @@ std::string GetOffsetVec(EmitContext& ctx, const IR::Value& offset) {
|
||||||
break;
|
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()) {
|
switch (offset.Type()) {
|
||||||
case IR::Type::U32:
|
case IR::Type::U32:
|
||||||
return fmt::format("int({})", offset_str);
|
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 bias{info.has_bias ? fmt::format(",{}", bias_lc) : ""};
|
||||||
const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)};
|
const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)};
|
||||||
const auto sparse_inst{PrepareSparse(inst)};
|
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()) {
|
if (!offset.IsEmpty()) {
|
||||||
const auto offset_str{GetOffsetVec(ctx, offset)};
|
const auto offset_str{GetOffsetVec(ctx, offset)};
|
||||||
if (ctx.stage == Stage::Fragment) {
|
if (ctx.stage == Stage::Fragment) {
|
||||||
|
@ -163,7 +172,6 @@ void EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst& inst, const IR::Valu
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO: Query sparseTexels extension support
|
|
||||||
if (!offset.IsEmpty()) {
|
if (!offset.IsEmpty()) {
|
||||||
ctx.AddU1("{}=sparseTexelsResidentARB(sparseTextureOffsetARB({},{},{},{}{}));",
|
ctx.AddU1("{}=sparseTexelsResidentARB(sparseTextureOffsetARB({},{},{},{}{}));",
|
||||||
*sparse_inst, texture, coords, GetOffsetVec(ctx, offset), texel, bias);
|
*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 texture{Texture(ctx, info, index)};
|
||||||
const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)};
|
const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)};
|
||||||
const auto sparse_inst{PrepareSparse(inst)};
|
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()) {
|
if (!offset.IsEmpty()) {
|
||||||
ctx.Add("{}=textureLodOffset({},{},{},{});", texel, texture, coords, lod_lc,
|
ctx.Add("{}=textureLodOffset({},{},{},{});", texel, texture, coords, lod_lc,
|
||||||
GetOffsetVec(ctx, offset));
|
GetOffsetVec(ctx, offset));
|
||||||
|
@ -195,7 +208,6 @@ void EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst& inst, const IR::Valu
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO: Query sparseTexels extension support
|
|
||||||
if (!offset.IsEmpty()) {
|
if (!offset.IsEmpty()) {
|
||||||
ctx.AddU1("{}=sparseTexelsResidentARB(sparseTexelFetchOffsetARB({},{},int({}),{},{}));",
|
ctx.AddU1("{}=sparseTexelsResidentARB(sparseTexelFetchOffsetARB({},{},int({}),{},{}));",
|
||||||
*sparse_inst, texture, CastToIntVec(coords, info), lod_lc,
|
*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 texture{Texture(ctx, info, index)};
|
||||||
const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)};
|
const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)};
|
||||||
const auto sparse_inst{PrepareSparse(inst)};
|
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()) {
|
if (offset.IsEmpty()) {
|
||||||
ctx.Add("{}=textureGather({},{},int({}));", texel, texture, coords,
|
ctx.Add("{}=textureGather({},{},int({}));", texel, texture, coords,
|
||||||
info.gather_component);
|
info.gather_component);
|
||||||
|
@ -332,7 +349,6 @@ void EmitImageGather(EmitContext& ctx, IR::Inst& inst, const IR::Value& index,
|
||||||
info.gather_component);
|
info.gather_component);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO: Query sparseTexels extension support
|
|
||||||
if (offset.IsEmpty()) {
|
if (offset.IsEmpty()) {
|
||||||
ctx.AddU1("{}=sparseTexelsResidentARB(sparseTextureGatherARB({},{},{},int({})));",
|
ctx.AddU1("{}=sparseTexelsResidentARB(sparseTextureGatherARB({},{},{},int({})));",
|
||||||
*sparse_inst, texture, coords, texel, info.gather_component);
|
*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 texture{Texture(ctx, info, index)};
|
||||||
const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)};
|
const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)};
|
||||||
const auto sparse_inst{PrepareSparse(inst)};
|
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()) {
|
if (offset.IsEmpty()) {
|
||||||
ctx.Add("{}=textureGather({},{},{});", texel, texture, coords, dref);
|
ctx.Add("{}=textureGather({},{},{});", texel, texture, coords, dref);
|
||||||
return;
|
return;
|
||||||
|
@ -373,7 +394,6 @@ void EmitImageGatherDref(EmitContext& ctx, IR::Inst& inst, const IR::Value& inde
|
||||||
ctx.Add("{}=textureGatherOffsets({},{},{},{});", texel, texture, coords, dref, offsets);
|
ctx.Add("{}=textureGatherOffsets({},{},{},{});", texel, texture, coords, dref, offsets);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO: Query sparseTexels extension support
|
|
||||||
if (offset.IsEmpty()) {
|
if (offset.IsEmpty()) {
|
||||||
ctx.AddU1("{}=sparseTexelsResidentARB(sparseTextureGatherARB({},{},{},{}));", *sparse_inst,
|
ctx.AddU1("{}=sparseTexelsResidentARB(sparseTextureGatherARB({},{},{},{}));", *sparse_inst,
|
||||||
texture, coords, dref, texel);
|
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 texture{Texture(ctx, info, index)};
|
||||||
const auto sparse_inst{PrepareSparse(inst)};
|
const auto sparse_inst{PrepareSparse(inst)};
|
||||||
const auto texel{ctx.var_alloc.Define(inst, GlslVarType::F32x4)};
|
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()) {
|
if (!offset.empty()) {
|
||||||
ctx.Add("{}=texelFetchOffset({},{},int({}),{});", texel, texture,
|
ctx.Add("{}=texelFetchOffset({},{},int({}),{});", texel, texture,
|
||||||
CoordsCastToInt(coords, info), lod, CoordsCastToInt(offset, info));
|
CoordsCastToInt(coords, info), lod, CoordsCastToInt(offset, info));
|
||||||
|
@ -418,7 +443,6 @@ void EmitImageFetch(EmitContext& ctx, IR::Inst& inst, const IR::Value& index,
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO: Query sparseTexels extension support
|
|
||||||
if (!offset.empty()) {
|
if (!offset.empty()) {
|
||||||
ctx.AddU1("{}=sparseTexelsResidentARB(sparseTexelFetchOffsetARB({},{},int({}),{},{}));",
|
ctx.AddU1("{}=sparseTexelsResidentARB(sparseTexelFetchOffsetARB({},{},int({}),{},{}));",
|
||||||
*sparse_inst, texture, CastToIntVec(coords, info), lod,
|
*sparse_inst, texture, CastToIntVec(coords, info), lod,
|
||||||
|
|
|
@ -87,6 +87,8 @@ struct Profile {
|
||||||
bool support_gl_amd_gpu_shader_half_float{};
|
bool support_gl_amd_gpu_shader_half_float{};
|
||||||
bool support_gl_texture_shadow_lod{};
|
bool support_gl_texture_shadow_lod{};
|
||||||
bool support_gl_warp_intrinsics{};
|
bool support_gl_warp_intrinsics{};
|
||||||
|
bool support_gl_variable_aoffi{};
|
||||||
|
bool support_gl_sparse_textures{};
|
||||||
|
|
||||||
bool warp_size_potentially_larger_than_guest{};
|
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_depth_buffer_float = HasExtension(extensions, "GL_NV_depth_buffer_float");
|
||||||
has_nv_gpu_shader_5 = GLAD_GL_NV_gpu_shader5;
|
has_nv_gpu_shader_5 = GLAD_GL_NV_gpu_shader5;
|
||||||
has_amd_shader_half_float = GLAD_GL_AMD_gpu_shader_half_float;
|
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;
|
warp_size_potentially_larger_than_guest = !is_nvidia && !is_intel;
|
||||||
|
|
||||||
// At the moment of writing this, only Nvidia's driver optimizes BufferSubData on exclusive
|
// 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;
|
return has_amd_shader_half_float;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HasSparseTexture2() const {
|
||||||
|
return has_sparse_texture_2;
|
||||||
|
}
|
||||||
|
|
||||||
bool IsWarpSizePotentiallyLargerThanGuest() const {
|
bool IsWarpSizePotentiallyLargerThanGuest() const {
|
||||||
return warp_size_potentially_larger_than_guest;
|
return warp_size_potentially_larger_than_guest;
|
||||||
}
|
}
|
||||||
|
@ -165,6 +169,7 @@ private:
|
||||||
bool has_depth_buffer_float{};
|
bool has_depth_buffer_float{};
|
||||||
bool has_nv_gpu_shader_5{};
|
bool has_nv_gpu_shader_5{};
|
||||||
bool has_amd_shader_half_float{};
|
bool has_amd_shader_half_float{};
|
||||||
|
bool has_sparse_texture_2{};
|
||||||
bool warp_size_potentially_larger_than_guest{};
|
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_amd_gpu_shader_half_float = device.HasAmdShaderHalfFloat(),
|
||||||
.support_gl_texture_shadow_lod = device.HasTextureShadowLod(),
|
.support_gl_texture_shadow_lod = device.HasTextureShadowLod(),
|
||||||
.support_gl_warp_intrinsics = false,
|
.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(),
|
.warp_size_potentially_larger_than_guest = device.IsWarpSizePotentiallyLargerThanGuest(),
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue