From d5b50a9fc044d9a14d3e11e1bb463ab481e5f358 Mon Sep 17 00:00:00 2001 From: GPUCode <47210458+GPUCode@users.noreply.github.com> Date: Mon, 13 Nov 2023 08:40:30 +0200 Subject: [PATCH] spv_fs_shader_gen: Remove OpTypeSampledImage from texture buffers (#7153) --- .../shader/generator/spv_fs_shader_gen.cpp | 34 +++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/src/video_core/shader/generator/spv_fs_shader_gen.cpp b/src/video_core/shader/generator/spv_fs_shader_gen.cpp index 44b19cd1c..f1bd1a09b 100644 --- a/src/video_core/shader/generator/spv_fs_shader_gen.cpp +++ b/src/video_core/shader/generator/spv_fs_shader_gen.cpp @@ -172,11 +172,9 @@ void FragmentModule::WriteFog() { const Id fog_lut_offset{GetShaderDataMember(i32_id, ConstS32(10))}; const Id coord{OpIAdd(i32_id, OpConvertFToS(i32_id, fog_i), fog_lut_offset)}; if (!Sirit::ValidId(texture_buffer_lut_lf)) { - const Id sampled_image{TypeSampledImage(image_buffer_id)}; - texture_buffer_lut_lf = OpLoad(sampled_image, texture_buffer_lut_lf_id); + texture_buffer_lut_lf = OpLoad(image_buffer_id, texture_buffer_lut_lf_id); } - const Id fog_lut_entry_rgba{ - OpImageFetch(vec_ids.Get(4), OpImage(image_buffer_id, texture_buffer_lut_lf), coord)}; + const Id fog_lut_entry_rgba{OpImageFetch(vec_ids.Get(4), texture_buffer_lut_lf, coord)}; const Id fog_lut_r{OpCompositeExtract(f32_id, fog_lut_entry_rgba, 0)}; const Id fog_lut_g{OpCompositeExtract(f32_id, fog_lut_entry_rgba, 1)}; Id fog_factor{OpFma(f32_id, fog_f, fog_lut_g, fog_lut_r)}; @@ -1152,11 +1150,9 @@ Id FragmentModule::ProcTexLookupLUT(Id offset, Id coord) { const Id index_f{OpFSub(f32_id, coord, index_i)}; const Id p{OpIAdd(i32_id, OpConvertFToS(i32_id, index_i), offset)}; if (!Sirit::ValidId(texture_buffer_lut_rg)) { - const Id sampled_image{TypeSampledImage(image_buffer_id)}; - texture_buffer_lut_rg = OpLoad(sampled_image, texture_buffer_lut_rg_id); + texture_buffer_lut_rg = OpLoad(image_buffer_id, texture_buffer_lut_rg_id); } - const Id entry{ - OpImageFetch(vec_ids.Get(4), OpImage(image_buffer_id, texture_buffer_lut_rg), p)}; + const Id entry{OpImageFetch(vec_ids.Get(4), texture_buffer_lut_rg, p)}; const Id entry_r{OpCompositeExtract(f32_id, entry, 0)}; const Id entry_g{OpCompositeExtract(f32_id, entry, 1)}; return OpFClamp(f32_id, OpFma(f32_id, entry_g, index_f, entry_r), ConstF32(0.f), ConstF32(1.f)); @@ -1234,12 +1230,10 @@ Id FragmentModule::SampleProcTexColor(Id lut_coord, Id level) { OpFMul(f32_id, lut_coord, OpConvertSToF(f32_id, OpISub(i32_id, lut_width, ConstS32(1)))); if (!Sirit::ValidId(texture_buffer_lut_rgba)) { - const Id sampled_image{TypeSampledImage(image_buffer_id)}; - texture_buffer_lut_rgba = OpLoad(sampled_image, texture_buffer_lut_rgba_id); + texture_buffer_lut_rgba = OpLoad(image_buffer_id, texture_buffer_lut_rgba_id); } const Id proctex_lut_offset{GetShaderDataMember(i32_id, ConstS32(14))}; - const Id lut_rgba{OpImage(image_buffer_id, texture_buffer_lut_rgba)}; switch (config.proctex.lut_filter) { case ProcTexFilter::Linear: @@ -1250,8 +1244,8 @@ Id FragmentModule::SampleProcTexColor(Id lut_coord, Id level) { const Id proctex_diff_lut_offset{GetShaderDataMember(i32_id, ConstS32(15))}; const Id p1{OpIAdd(i32_id, lut_index_i, proctex_lut_offset)}; const Id p2{OpIAdd(i32_id, lut_index_i, proctex_diff_lut_offset)}; - const Id texel1{OpImageFetch(vec_ids.Get(4), lut_rgba, p1)}; - const Id texel2{OpImageFetch(vec_ids.Get(4), lut_rgba, p2)}; + const Id texel1{OpImageFetch(vec_ids.Get(4), texture_buffer_lut_rgba, p1)}; + const Id texel2{OpImageFetch(vec_ids.Get(4), texture_buffer_lut_rgba, p2)}; return OpFAdd(vec_ids.Get(4), texel1, OpVectorTimesScalar(vec_ids.Get(4), texel2, lut_index_f)); } @@ -1261,7 +1255,7 @@ Id FragmentModule::SampleProcTexColor(Id lut_coord, Id level) { lut_coord = OpFAdd(f32_id, lut_coord, OpConvertSToF(f32_id, lut_offset)); const Id lut_coord_rounded{OpConvertFToS(i32_id, OpRound(f32_id, lut_coord))}; const Id p{OpIAdd(i32_id, lut_coord_rounded, proctex_lut_offset)}; - return OpImageFetch(vec_ids.Get(4), lut_rgba, p); + return OpImageFetch(vec_ids.Get(4), texture_buffer_lut_rgba, p); } } @@ -1271,16 +1265,14 @@ Id FragmentModule::SampleProcTexColor(Id lut_coord, Id level) { Id FragmentModule::LookupLightingLUT(Id lut_index, Id index, Id delta) { // Only load the texture buffer lut once if (!Sirit::ValidId(texture_buffer_lut_lf)) { - const Id sampled_image{TypeSampledImage(image_buffer_id)}; - texture_buffer_lut_lf = OpLoad(sampled_image, texture_buffer_lut_lf_id); + texture_buffer_lut_lf = OpLoad(image_buffer_id, texture_buffer_lut_lf_id); } const Id lut_index_x{OpShiftRightArithmetic(i32_id, lut_index, ConstS32(2))}; const Id lut_index_y{OpBitwiseAnd(i32_id, lut_index, ConstS32(3))}; const Id lut_offset{GetShaderDataMember(i32_id, ConstS32(18), lut_index_x, lut_index_y)}; const Id coord{OpIAdd(i32_id, lut_offset, index)}; - const Id entry{ - OpImageFetch(vec_ids.Get(4), OpImage(image_buffer_id, texture_buffer_lut_lf), coord)}; + const Id entry{OpImageFetch(vec_ids.Get(4), texture_buffer_lut_lf, coord)}; const Id entry_r{OpCompositeExtract(f32_id, entry, 0)}; const Id entry_g{OpCompositeExtract(f32_id, entry, 1)}; return OpFma(f32_id, entry_g, delta, entry_r); @@ -1579,9 +1571,9 @@ void FragmentModule::DefineInterface() { image_r32_id = TypeImage(u32_id, spv::Dim::Dim2D, 0, 0, 0, 2, spv::ImageFormat::R32ui); sampler_id = TypeSampler(); - texture_buffer_lut_lf_id = DefineUniformConst(TypeSampledImage(image_buffer_id), 0, 3); - texture_buffer_lut_rg_id = DefineUniformConst(TypeSampledImage(image_buffer_id), 0, 4); - texture_buffer_lut_rgba_id = DefineUniformConst(TypeSampledImage(image_buffer_id), 0, 5); + texture_buffer_lut_lf_id = DefineUniformConst(image_buffer_id, 0, 3); + texture_buffer_lut_rg_id = DefineUniformConst(image_buffer_id, 0, 4); + texture_buffer_lut_rgba_id = DefineUniformConst(image_buffer_id, 0, 5); tex0_id = DefineUniformConst(TypeSampledImage(image2d_id), 1, 0); tex1_id = DefineUniformConst(TypeSampledImage(image2d_id), 1, 1); tex2_id = DefineUniformConst(TypeSampledImage(image2d_id), 1, 2);