diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index d802a9d73..945cdb42b 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -1,5 +1,4 @@ // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project -// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include @@ -196,41 +195,6 @@ Id Texture(EmitContext& ctx, IR::TextureInstInfo info, [[maybe_unused]] const IR } } -Id TextureColorResultType(EmitContext& ctx, const TextureDefinition& def) { - switch (def.component_type) { - case SamplerComponentType::Float: - case SamplerComponentType::Depth: - return ctx.F32[4]; - case SamplerComponentType::Sint: - return ctx.S32[4]; - case SamplerComponentType::Stencil: - return ctx.U32[4]; - case SamplerComponentType::Uint: - return ctx.U32[4]; - } - throw InvalidArgument("Invalid sampler component type {}", def.component_type); -} - -Id TextureSampleResultToFloat(EmitContext& ctx, const TextureDefinition& def, Id color) { - switch (def.component_type) { - case SamplerComponentType::Float: - case SamplerComponentType::Depth: - return color; - case SamplerComponentType::Sint: - return ctx.OpConvertSToF(ctx.F32[4], color); - case SamplerComponentType::Stencil: - { - const Id converted{ctx.OpConvertUToF(ctx.F32[4], color)}; - const Id inv255{ctx.Const(1.0f / 255.0f)}; - const Id scale{ctx.ConstantComposite(ctx.F32[4], inv255, inv255, inv255, inv255)}; - return ctx.OpFMul(ctx.F32[4], converted, scale); - } - case SamplerComponentType::Uint: - return ctx.OpConvertUToF(ctx.F32[4], color); - } - throw InvalidArgument("Invalid sampler component type {}", def.component_type); -} - Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info, const IR::Value& index) { if (!index.IsImmediate() || index.U32() != 0) { throw NotImplementedException("Indirect image indexing"); @@ -485,39 +449,31 @@ Id EmitBoundImageWrite(EmitContext&) { Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id bias_lc, const IR::Value& offset) { const auto info{inst->Flags()}; - const TextureDefinition& def{ctx.textures.at(info.descriptor_index)}; - const Id color_type{TextureColorResultType(ctx, def)}; - const Id texture{Texture(ctx, info, index)}; - Id color{}; if (ctx.stage == Stage::Fragment) { const ImageOperands operands(ctx, info.has_bias != 0, false, info.has_lod_clamp != 0, bias_lc, offset); - color = Emit(&EmitContext::OpImageSparseSampleImplicitLod, - &EmitContext::OpImageSampleImplicitLod, ctx, inst, color_type, texture, - coords, operands.MaskOptional(), operands.Span()); + return Emit(&EmitContext::OpImageSparseSampleImplicitLod, + &EmitContext::OpImageSampleImplicitLod, ctx, inst, ctx.F32[4], + Texture(ctx, info, index), coords, operands.MaskOptional(), operands.Span()); } else { // We can't use implicit lods on non-fragment stages on SPIR-V. Maxwell hardware behaves as // if the lod was explicitly zero. This may change on Turing with implicit compute // derivatives const Id lod{ctx.Const(0.0f)}; const ImageOperands operands(ctx, false, true, info.has_lod_clamp != 0, lod, offset); - color = Emit(&EmitContext::OpImageSparseSampleExplicitLod, - &EmitContext::OpImageSampleExplicitLod, ctx, inst, color_type, texture, - coords, operands.Mask(), operands.Span()); + return Emit(&EmitContext::OpImageSparseSampleExplicitLod, + &EmitContext::OpImageSampleExplicitLod, ctx, inst, ctx.F32[4], + Texture(ctx, info, index), coords, operands.Mask(), operands.Span()); } - return TextureSampleResultToFloat(ctx, def, color); } Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id lod, const IR::Value& offset) { const auto info{inst->Flags()}; - const TextureDefinition& def{ctx.textures.at(info.descriptor_index)}; - const Id color_type{TextureColorResultType(ctx, def)}; const ImageOperands operands(ctx, false, true, false, lod, offset); - const Id color{Emit(&EmitContext::OpImageSparseSampleExplicitLod, - &EmitContext::OpImageSampleExplicitLod, ctx, inst, color_type, - Texture(ctx, info, index), coords, operands.Mask(), operands.Span())}; - return TextureSampleResultToFloat(ctx, def, color); + return Emit(&EmitContext::OpImageSparseSampleExplicitLod, + &EmitContext::OpImageSampleExplicitLod, ctx, inst, ctx.F32[4], + Texture(ctx, info, index), coords, operands.Mask(), operands.Span()); } Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, @@ -553,18 +509,13 @@ Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Va Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, const IR::Value& offset, const IR::Value& offset2) { const auto info{inst->Flags()}; - const TextureDefinition& def{ctx.textures.at(info.descriptor_index)}; - const Id color_type{TextureColorResultType(ctx, def)}; const ImageOperands operands(ctx, offset, offset2); - const Id texture{Texture(ctx, info, index)}; if (ctx.profile.need_gather_subpixel_offset) { coords = ImageGatherSubpixelOffset(ctx, info, TextureImage(ctx, info, index), coords); } - const Id color{ - Emit(&EmitContext::OpImageSparseGather, &EmitContext::OpImageGather, ctx, inst, color_type, - texture, coords, ctx.Const(info.gather_component), operands.MaskOptional(), - operands.Span())}; - return TextureSampleResultToFloat(ctx, def, color); + return Emit(&EmitContext::OpImageSparseGather, &EmitContext::OpImageGather, ctx, inst, + ctx.F32[4], Texture(ctx, info, index), coords, ctx.Const(info.gather_component), + operands.MaskOptional(), operands.Span()); } Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, @@ -582,9 +533,6 @@ Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset, Id lod, Id ms) { const auto info{inst->Flags()}; - const TextureDefinition* def = - info.type == TextureType::Buffer ? nullptr : &ctx.textures.at(info.descriptor_index); - const Id result_type{def ? TextureColorResultType(ctx, *def) : ctx.F32[4]}; AddOffsetToCoordinates(ctx, info, coords, offset); if (info.type == TextureType::Buffer) { lod = Id{}; @@ -594,13 +542,8 @@ Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id c lod = Id{}; } const ImageOperands operands(lod, ms); - Id color{Emit(&EmitContext::OpImageSparseFetch, &EmitContext::OpImageFetch, ctx, inst, - result_type, TextureImage(ctx, info, index), coords, operands.MaskOptional(), - operands.Span())}; - if (def) { - color = TextureSampleResultToFloat(ctx, *def, color); - } - return color; + return Emit(&EmitContext::OpImageSparseFetch, &EmitContext::OpImageFetch, ctx, inst, ctx.F32[4], + TextureImage(ctx, info, index), coords, operands.MaskOptional(), operands.Span()); } Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id lod, @@ -645,17 +588,14 @@ Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, I Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id derivatives, const IR::Value& offset, Id lod_clamp) { const auto info{inst->Flags()}; - const TextureDefinition& def{ctx.textures.at(info.descriptor_index)}; - const Id color_type{TextureColorResultType(ctx, def)}; const auto operands = info.num_derivatives == 3 ? ImageOperands(ctx, info.has_lod_clamp != 0, derivatives, ctx.Def(offset), {}, lod_clamp) : ImageOperands(ctx, info.has_lod_clamp != 0, derivatives, info.num_derivatives, offset, lod_clamp); - const Id color{Emit(&EmitContext::OpImageSparseSampleExplicitLod, - &EmitContext::OpImageSampleExplicitLod, ctx, inst, color_type, - Texture(ctx, info, index), coords, operands.Mask(), operands.Span())}; - return TextureSampleResultToFloat(ctx, def, color); + return Emit(&EmitContext::OpImageSparseSampleExplicitLod, + &EmitContext::OpImageSampleExplicitLod, ctx, inst, ctx.F32[4], + Texture(ctx, info, index), coords, operands.Mask(), operands.Span()); } Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords) { diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 4b94bc81d..6527eb3d8 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -26,40 +26,28 @@ enum class Operation { FPMax, }; -Id ComponentScalarType(EmitContext& ctx, SamplerComponentType component_type) { - switch (component_type) { - case SamplerComponentType::Float: - case SamplerComponentType::Depth: - return ctx.F32[1]; - case SamplerComponentType::Sint: - case SamplerComponentType::Stencil: - return ctx.S32[1]; - case SamplerComponentType::Uint: - return ctx.U32[1]; - } - throw InvalidArgument("Invalid sampler component type {}", component_type); -} - -Id ImageType(EmitContext& ctx, const TextureDescriptor& desc, Id sampled_type) { +Id ImageType(EmitContext& ctx, const TextureDescriptor& desc) { const spv::ImageFormat format{spv::ImageFormat::Unknown}; + // Use integer type for integer textures to match the actual texture format + const Id type{desc.is_integer ? ctx.U32[1] : ctx.F32[1]}; const bool depth{desc.is_depth}; const bool ms{desc.is_multisample}; switch (desc.type) { case TextureType::Color1D: - return ctx.TypeImage(sampled_type, spv::Dim::Dim1D, depth, false, false, 1, format); + return ctx.TypeImage(type, spv::Dim::Dim1D, depth, false, false, 1, format); case TextureType::ColorArray1D: - return ctx.TypeImage(sampled_type, spv::Dim::Dim1D, depth, true, false, 1, format); + return ctx.TypeImage(type, spv::Dim::Dim1D, depth, true, false, 1, format); case TextureType::Color2D: case TextureType::Color2DRect: - return ctx.TypeImage(sampled_type, spv::Dim::Dim2D, depth, false, ms, 1, format); + return ctx.TypeImage(type, spv::Dim::Dim2D, depth, false, ms, 1, format); case TextureType::ColorArray2D: - return ctx.TypeImage(sampled_type, spv::Dim::Dim2D, depth, true, ms, 1, format); + return ctx.TypeImage(type, spv::Dim::Dim2D, depth, true, ms, 1, format); case TextureType::Color3D: - return ctx.TypeImage(sampled_type, spv::Dim::Dim3D, depth, false, false, 1, format); + return ctx.TypeImage(type, spv::Dim::Dim3D, depth, false, false, 1, format); case TextureType::ColorCube: - return ctx.TypeImage(sampled_type, spv::Dim::Cube, depth, false, false, 1, format); + return ctx.TypeImage(type, spv::Dim::Cube, depth, false, false, 1, format); case TextureType::ColorArrayCube: - return ctx.TypeImage(sampled_type, spv::Dim::Cube, depth, true, false, 1, format); + return ctx.TypeImage(type, spv::Dim::Cube, depth, true, false, 1, format); case TextureType::Buffer: break; } @@ -338,9 +326,6 @@ void DefineSsbos(EmitContext& ctx, StorageTypeDefinition& type_def, ctx.Decorate(id, spv::Decoration::Binding, binding); ctx.Decorate(id, spv::Decoration::DescriptorSet, 0U); ctx.Name(id, fmt::format("ssbo{}", index)); - if (!desc.is_written) { - ctx.Decorate(id, spv::Decoration::NonWritable); - } if (ctx.profile.supported_spirv >= 0x00010400) { ctx.interfaces.push_back(id); } @@ -572,7 +557,6 @@ void EmitContext::DefineCommonTypes(const Info& info) { output_f32 = Name(TypePointer(spv::StorageClass::Output, F32[1]), "output_f32"); output_u32 = Name(TypePointer(spv::StorageClass::Output, U32[1]), "output_u32"); - output_s32 = Name(TypePointer(spv::StorageClass::Output, S32[1]), "output_s32"); if (info.uses_int8 && profile.support_int8) { AddCapability(spv::Capability::Int8); @@ -1386,8 +1370,7 @@ void EmitContext::DefineImageBuffers(const Info& info, u32& binding) { void EmitContext::DefineTextures(const Info& info, u32& binding, u32& scaling_index) { textures.reserve(info.texture_descriptors.size()); for (const TextureDescriptor& desc : info.texture_descriptors) { - const Id result_type{ComponentScalarType(*this, desc.component_type)}; - const Id image_type{ImageType(*this, desc, result_type)}; + const Id image_type{ImageType(*this, desc)}; const Id sampled_type{TypeSampledImage(image_type)}; const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, sampled_type)}; const Id desc_type{DescType(*this, sampled_type, pointer_type, desc.count)}; @@ -1400,10 +1383,9 @@ void EmitContext::DefineTextures(const Info& info, u32& binding, u32& scaling_in .sampled_type = sampled_type, .pointer_type = pointer_type, .image_type = image_type, - .result_type = result_type, .count = desc.count, .is_multisample = desc.is_multisample, - .component_type = desc.component_type, + .is_integer = desc.is_integer, }); if (profile.supported_spirv >= 0x00010400) { interfaces.push_back(id); @@ -1462,9 +1444,6 @@ void EmitContext::DefineInputs(const IR::Program& program) { } if (info.uses_sample_id) { sample_id = DefineInput(*this, U32[1], false, spv::BuiltIn::SampleId); - if (stage == Stage::Fragment) { - Decorate(sample_id, spv::Decoration::Flat); - } } if (info.uses_is_helper_invocation) { is_helper_invocation = DefineInput(*this, U1, false, spv::BuiltIn::HelperInvocation); @@ -1475,13 +1454,6 @@ void EmitContext::DefineInputs(const IR::Program& program) { subgroup_mask_le = DefineInput(*this, U32[4], false, spv::BuiltIn::SubgroupLeMaskKHR); subgroup_mask_gt = DefineInput(*this, U32[4], false, spv::BuiltIn::SubgroupGtMaskKHR); subgroup_mask_ge = DefineInput(*this, U32[4], false, spv::BuiltIn::SubgroupGeMaskKHR); - if (stage == Stage::Fragment) { - Decorate(subgroup_mask_eq, spv::Decoration::Flat); - Decorate(subgroup_mask_lt, spv::Decoration::Flat); - Decorate(subgroup_mask_le, spv::Decoration::Flat); - Decorate(subgroup_mask_gt, spv::Decoration::Flat); - Decorate(subgroup_mask_ge, spv::Decoration::Flat); - } } if (info.uses_fswzadd || info.uses_subgroup_invocation_id || info.uses_subgroup_shuffles || (profile.warp_size_potentially_larger_than_guest && @@ -1489,9 +1461,7 @@ void EmitContext::DefineInputs(const IR::Program& program) { AddCapability(spv::Capability::GroupNonUniform); subgroup_local_invocation_id = DefineInput(*this, U32[1], false, spv::BuiltIn::SubgroupLocalInvocationId); - if (stage == Stage::Fragment) { - Decorate(subgroup_local_invocation_id, spv::Decoration::Flat); - } + Decorate(subgroup_local_invocation_id, spv::Decoration::Flat); } if (info.uses_fswzadd) { const Id f32_one{Const(1.0f)}; @@ -1503,9 +1473,6 @@ void EmitContext::DefineInputs(const IR::Program& program) { } if (loads[IR::Attribute::PrimitiveId]) { primitive_id = DefineInput(*this, U32[1], false, spv::BuiltIn::PrimitiveId); - if (stage == Stage::Fragment) { - Decorate(primitive_id, spv::Decoration::Flat); - } } if (loads[IR::Attribute::Layer]) { AddCapability(spv::Capability::Geometry); @@ -1597,21 +1564,17 @@ void EmitContext::DefineInputs(const IR::Program& program) { if (stage != Stage::Fragment) { continue; } - const bool is_integer = input_type == AttributeType::SignedInt || - input_type == AttributeType::UnsignedInt; - if (is_integer) { + switch (info.interpolation[index]) { + case Interpolation::Smooth: + // Default + // Decorate(id, spv::Decoration::Smooth); + break; + case Interpolation::NoPerspective: + Decorate(id, spv::Decoration::NoPerspective); + break; + case Interpolation::Flat: Decorate(id, spv::Decoration::Flat); - } else { - switch (info.interpolation[index]) { - case Interpolation::Smooth: - break; - case Interpolation::NoPerspective: - Decorate(id, spv::Decoration::NoPerspective); - break; - case Interpolation::Flat: - Decorate(id, spv::Decoration::Flat); - break; - } + break; } } if (stage == Stage::TessellationEval) { diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index 126e3d1d0..a17821009 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -35,10 +35,9 @@ struct TextureDefinition { Id sampled_type; Id pointer_type; Id image_type; - Id result_type; u32 count; bool is_multisample; - SamplerComponentType component_type; + bool is_integer; }; struct TextureBufferDefinition { @@ -245,7 +244,6 @@ public: Id output_f32{}; Id output_u32{}; - Id output_s32{}; Id image_buffer_type{}; Id image_u32{}; diff --git a/src/shader_recompiler/environment.h b/src/shader_recompiler/environment.h index f6a7e64a8..5dbbc7e61 100644 --- a/src/shader_recompiler/environment.h +++ b/src/shader_recompiler/environment.h @@ -1,5 +1,4 @@ // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project -// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -23,8 +22,6 @@ public: [[nodiscard]] virtual TextureType ReadTextureType(u32 raw_handle) = 0; - [[nodiscard]] virtual SamplerComponentType ReadTextureComponentType(u32 raw_handle) = 0; - [[nodiscard]] virtual TexturePixelFormat ReadTexturePixelFormat(u32 raw_handle) = 0; [[nodiscard]] virtual bool IsTexturePixelFormatInteger(u32 raw_handle) = 0; diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp index 50f3fc368..92612b28c 100644 --- a/src/shader_recompiler/ir_opt/texture_pass.cpp +++ b/src/shader_recompiler/ir_opt/texture_pass.cpp @@ -393,10 +393,6 @@ bool IsTexturePixelFormatInteger(Environment& env, const ConstBufferAddr& cbuf) return env.IsTexturePixelFormatInteger(GetTextureHandle(env, cbuf)); } -SamplerComponentType ReadTextureComponentType(Environment& env, const ConstBufferAddr& cbuf) { - return env.ReadTextureComponentType(GetTextureHandle(env, cbuf)); -} - class Descriptors { public: explicit Descriptors(TextureBufferDescriptors& texture_buffer_descriptors_, @@ -434,9 +430,7 @@ public: u32 Add(const TextureDescriptor& desc) { const u32 index{Add(texture_descriptors, desc, [&desc](const auto& existing) { - return desc.type == existing.type && - desc.component_type == existing.component_type && - desc.is_depth == existing.is_depth && + return desc.type == existing.type && desc.is_depth == existing.is_depth && desc.has_secondary == existing.has_secondary && desc.cbuf_index == existing.cbuf_index && desc.cbuf_offset == existing.cbuf_offset && @@ -675,7 +669,6 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo const bool is_integer{IsTexturePixelFormatInteger(env, cbuf)}; index = descriptors.Add(TextureDescriptor{ .type = flags.type, - .component_type = ReadTextureComponentType(env, cbuf), .is_depth = flags.is_depth != 0, .is_multisample = is_multisample, .is_integer = is_integer, diff --git a/src/shader_recompiler/shader_info.h b/src/shader_recompiler/shader_info.h index fb1f0697c..74c402632 100644 --- a/src/shader_recompiler/shader_info.h +++ b/src/shader_recompiler/shader_info.h @@ -158,14 +158,6 @@ enum class ImageFormat : u32 { R32G32B32A32_SFLOAT, }; -enum class SamplerComponentType : u8 { - Float, - Sint, - Uint, - Depth, - Stencil, -}; - enum class Interpolation { Smooth, Flat, @@ -219,7 +211,6 @@ using ImageBufferDescriptors = boost::container::small_vector> 2u)) * bytes_per_block; - pos.y = block_coord.y + (pc.origin.y >> 2u); - pos.z = block_coord.z + pc.origin.z; - - uint swizzle = SwizzleOffset(pos.xy); - uint block_y = pos.y >> GOB_SIZE_Y_SHIFT; - uint offset = 0u; - // Apply block-linear offsets - offset += (pos.z >> pc.block_depth) * pc.slice_size; - offset += (pos.z & pc.block_depth_mask) << (GOB_SIZE_SHIFT + pc.block_height); - offset += (block_y >> pc.block_height) * pc.block_size; - offset += (block_y & pc.block_height_mask) << GOB_SIZE_SHIFT; - offset += (pos.x >> GOB_SIZE_X_SHIFT) << pc.x_shift; - offset += swizzle; - - uvec4 texel = ReadTexel(offset); - - // Calculate linear output index - uint block_index = block_coord.x + - (block_coord.y * pc.blocks_dim.x) + - (block_coord.z * pc.blocks_dim.x * pc.blocks_dim.y); - uint out_idx = block_index * (bytes_per_block >> 2u); - - out_u32[out_idx] = texel.x; - out_u32[out_idx + 1] = texel.y; - if (pc.bytes_per_block_log2 == 4u) { - out_u32[out_idx + 2] = texel.z; - out_u32[out_idx + 3] = texel.w; - } -} diff --git a/src/video_core/shader_environment.cpp b/src/video_core/shader_environment.cpp index a13bb67d6..4aea915a9 100644 --- a/src/video_core/shader_environment.cpp +++ b/src/video_core/shader_environment.cpp @@ -1,5 +1,4 @@ // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project -// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include @@ -69,59 +68,6 @@ static Shader::TexturePixelFormat ConvertTexturePixelFormat(const Tegra::Texture entry.a_type, entry.srgb_conversion)); } -static Shader::SamplerComponentType ConvertSamplerComponentType( - const Tegra::Texture::TICEntry& entry) { - const auto pixel_format = PixelFormatFromTextureInfo(entry.format, entry.r_type, entry.g_type, - entry.b_type, entry.a_type, - entry.srgb_conversion); - const auto surface_type = VideoCore::Surface::GetFormatType(pixel_format); - if (entry.depth_texture != 0 || surface_type == VideoCore::Surface::SurfaceType::Depth) { - return Shader::SamplerComponentType::Depth; - } - if (surface_type == VideoCore::Surface::SurfaceType::Stencil) { - return Shader::SamplerComponentType::Stencil; - } - if (surface_type == VideoCore::Surface::SurfaceType::DepthStencil) { - return entry.depth_texture != 0 ? Shader::SamplerComponentType::Depth - : Shader::SamplerComponentType::Stencil; - } - - const auto accumulate = [](const Tegra::Texture::ComponentType component, - bool& has_signed, bool& has_unsigned) { - switch (component) { - case Tegra::Texture::ComponentType::SINT: - has_signed = true; - break; - case Tegra::Texture::ComponentType::UINT: - has_unsigned = true; - break; - default: - break; - } - }; - - bool has_signed{}; - bool has_unsigned{}; - accumulate(entry.r_type, has_signed, has_unsigned); - accumulate(entry.g_type, has_signed, has_unsigned); - accumulate(entry.b_type, has_signed, has_unsigned); - accumulate(entry.a_type, has_signed, has_unsigned); - - if (has_signed && !has_unsigned) { - return Shader::SamplerComponentType::Sint; - } - if (has_unsigned && !has_signed) { - return Shader::SamplerComponentType::Uint; - } - if (has_signed) { - return Shader::SamplerComponentType::Sint; - } - if (has_unsigned) { - return Shader::SamplerComponentType::Uint; - } - return Shader::SamplerComponentType::Float; -} - static std::string_view StageToPrefix(Shader::Stage stage) { switch (stage) { case Shader::Stage::VertexB: @@ -252,7 +198,6 @@ void GenericEnvironment::Serialize(std::ofstream& file) const { const u64 code_size{static_cast(CachedSizeBytes())}; const u64 num_texture_types{static_cast(texture_types.size())}; const u64 num_texture_pixel_formats{static_cast(texture_pixel_formats.size())}; - const u64 num_texture_component_types{static_cast(texture_component_types.size())}; const u64 num_cbuf_values{static_cast(cbuf_values.size())}; const u64 num_cbuf_replacement_values{static_cast(cbuf_replacements.size())}; @@ -260,8 +205,6 @@ void GenericEnvironment::Serialize(std::ofstream& file) const { .write(reinterpret_cast(&num_texture_types), sizeof(num_texture_types)) .write(reinterpret_cast(&num_texture_pixel_formats), sizeof(num_texture_pixel_formats)) - .write(reinterpret_cast(&num_texture_component_types), - sizeof(num_texture_component_types)) .write(reinterpret_cast(&num_cbuf_values), sizeof(num_cbuf_values)) .write(reinterpret_cast(&num_cbuf_replacement_values), sizeof(num_cbuf_replacement_values)) @@ -278,10 +221,6 @@ void GenericEnvironment::Serialize(std::ofstream& file) const { file.write(reinterpret_cast(&key), sizeof(key)) .write(reinterpret_cast(&type), sizeof(type)); } - for (const auto& [key, component] : texture_component_types) { - file.write(reinterpret_cast(&key), sizeof(key)) - .write(reinterpret_cast(&component), sizeof(component)); - } for (const auto& [key, format] : texture_pixel_formats) { file.write(reinterpret_cast(&key), sizeof(key)) .write(reinterpret_cast(&format), sizeof(format)); @@ -466,31 +405,12 @@ std::optional GraphicsEnvironment::GetReplaceConstBuffe } Shader::TextureType GraphicsEnvironment::ReadTextureType(u32 handle) { - const auto it{texture_types.find(handle)}; - if (it != texture_types.end()) { - return it->second; - } const auto& regs{maxwell3d->regs}; const bool via_header_index{regs.sampler_binding == Maxwell::SamplerBinding::ViaHeaderBinding}; auto entry = ReadTextureInfo(regs.tex_header.Address(), regs.tex_header.limit, via_header_index, handle); const Shader::TextureType result{ConvertTextureType(entry)}; texture_types.emplace(handle, result); - texture_component_types.emplace(handle, ConvertSamplerComponentType(entry)); - return result; -} - -Shader::SamplerComponentType GraphicsEnvironment::ReadTextureComponentType(u32 handle) { - const auto it{texture_component_types.find(handle)}; - if (it != texture_component_types.end()) { - return it->second; - } - const auto& regs{maxwell3d->regs}; - const bool via_header_index{regs.sampler_binding == Maxwell::SamplerBinding::ViaHeaderBinding}; - auto entry = - ReadTextureInfo(regs.tex_header.Address(), regs.tex_header.limit, via_header_index, handle); - const Shader::SamplerComponentType result{ConvertSamplerComponentType(entry)}; - texture_component_types.emplace(handle, result); return result; } @@ -542,29 +462,11 @@ u32 ComputeEnvironment::ReadCbufValue(u32 cbuf_index, u32 cbuf_offset) { } Shader::TextureType ComputeEnvironment::ReadTextureType(u32 handle) { - const auto it{texture_types.find(handle)}; - if (it != texture_types.end()) { - return it->second; - } const auto& regs{kepler_compute->regs}; const auto& qmd{kepler_compute->launch_description}; auto entry = ReadTextureInfo(regs.tic.Address(), regs.tic.limit, qmd.linked_tsc != 0, handle); const Shader::TextureType result{ConvertTextureType(entry)}; texture_types.emplace(handle, result); - texture_component_types.emplace(handle, ConvertSamplerComponentType(entry)); - return result; -} - -Shader::SamplerComponentType ComputeEnvironment::ReadTextureComponentType(u32 handle) { - const auto it{texture_component_types.find(handle)}; - if (it != texture_component_types.end()) { - return it->second; - } - const auto& regs{kepler_compute->regs}; - const auto& qmd{kepler_compute->launch_description}; - auto entry = ReadTextureInfo(regs.tic.Address(), regs.tic.limit, qmd.linked_tsc != 0, handle); - const Shader::SamplerComponentType result{ConvertSamplerComponentType(entry)}; - texture_component_types.emplace(handle, result); return result; } @@ -590,15 +492,12 @@ void FileEnvironment::Deserialize(std::ifstream& file) { u64 code_size{}; u64 num_texture_types{}; u64 num_texture_pixel_formats{}; - u64 num_texture_component_types{}; u64 num_cbuf_values{}; u64 num_cbuf_replacement_values{}; file.read(reinterpret_cast(&code_size), sizeof(code_size)) .read(reinterpret_cast(&num_texture_types), sizeof(num_texture_types)) .read(reinterpret_cast(&num_texture_pixel_formats), sizeof(num_texture_pixel_formats)) - .read(reinterpret_cast(&num_texture_component_types), - sizeof(num_texture_component_types)) .read(reinterpret_cast(&num_cbuf_values), sizeof(num_cbuf_values)) .read(reinterpret_cast(&num_cbuf_replacement_values), sizeof(num_cbuf_replacement_values)) @@ -618,13 +517,6 @@ void FileEnvironment::Deserialize(std::ifstream& file) { .read(reinterpret_cast(&type), sizeof(type)); texture_types.emplace(key, type); } - for (size_t i = 0; i < num_texture_component_types; ++i) { - u32 key; - Shader::SamplerComponentType component; - file.read(reinterpret_cast(&key), sizeof(key)) - .read(reinterpret_cast(&component), sizeof(component)); - texture_component_types.emplace(key, component); - } for (size_t i = 0; i < num_texture_pixel_formats; ++i) { u32 key; Shader::TexturePixelFormat format; @@ -687,15 +579,6 @@ Shader::TextureType FileEnvironment::ReadTextureType(u32 handle) { return it->second; } -Shader::SamplerComponentType FileEnvironment::ReadTextureComponentType(u32 handle) { - const auto it{texture_component_types.find(handle)}; - if (it == texture_component_types.end()) { - LOG_WARNING(Render_Vulkan, "Texture component descriptor {:08x} not found", handle); - return Shader::SamplerComponentType::Float; - } - return it->second; -} - Shader::TexturePixelFormat FileEnvironment::ReadTexturePixelFormat(u32 handle) { const auto it{texture_pixel_formats.find(handle)}; if (it == texture_pixel_formats.end()) { diff --git a/src/video_core/shader_environment.h b/src/video_core/shader_environment.h index 354310b7f..6b372e336 100644 --- a/src/video_core/shader_environment.h +++ b/src/video_core/shader_environment.h @@ -1,5 +1,4 @@ // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project -// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once @@ -78,7 +77,6 @@ protected: std::vector code; std::unordered_map texture_types; - std::unordered_map texture_component_types; std::unordered_map texture_pixel_formats; std::unordered_map cbuf_values; std::unordered_map cbuf_replacements; @@ -115,8 +113,6 @@ public: Shader::TextureType ReadTextureType(u32 handle) override; - Shader::SamplerComponentType ReadTextureComponentType(u32 handle) override; - Shader::TexturePixelFormat ReadTexturePixelFormat(u32 handle) override; bool IsTexturePixelFormatInteger(u32 handle) override; @@ -143,8 +139,6 @@ public: Shader::TextureType ReadTextureType(u32 handle) override; - Shader::SamplerComponentType ReadTextureComponentType(u32 handle) override; - Shader::TexturePixelFormat ReadTexturePixelFormat(u32 handle) override; bool IsTexturePixelFormatInteger(u32 handle) override; @@ -179,8 +173,6 @@ public: [[nodiscard]] Shader::TextureType ReadTextureType(u32 handle) override; - [[nodiscard]] Shader::SamplerComponentType ReadTextureComponentType(u32 handle) override; - [[nodiscard]] Shader::TexturePixelFormat ReadTexturePixelFormat(u32 handle) override; [[nodiscard]] bool IsTexturePixelFormatInteger(u32 handle) override; @@ -207,7 +199,6 @@ public: private: std::vector code; std::unordered_map texture_types; - std::unordered_map texture_component_types; std::unordered_map texture_pixel_formats; std::unordered_map cbuf_values; std::unordered_map cbuf_replacements;