diff options
| author | 2022-08-31 10:40:45 +0200 | |
|---|---|---|
| committer | 2022-08-31 10:40:45 +0200 | |
| commit | a83a5d2e4c8932df864dd4cea2b04d87a12c8760 (patch) | |
| tree | 53bd0ce10e965110c7811bd227443fd51e054eff | |
| parent | Merge pull request #8809 from german77/finally_is_fixed (diff) | |
| parent | video_code: support rectangle texture (diff) | |
| download | yuzu-a83a5d2e4c8932df864dd4cea2b04d87a12c8760.tar.gz yuzu-a83a5d2e4c8932df864dd4cea2b04d87a12c8760.tar.xz yuzu-a83a5d2e4c8932df864dd4cea2b04d87a12c8760.zip | |
Merge pull request #8752 from vonchenplus/rectangle_texture
video_code: support rectangle texture
Diffstat (limited to '')
14 files changed, 62 insertions, 15 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp index a97b143e4..e67e80fac 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_image.cpp | |||
| @@ -67,6 +67,7 @@ std::string_view TextureType(IR::TextureInstInfo info) { | |||
| 67 | case TextureType::ColorArray1D: | 67 | case TextureType::ColorArray1D: |
| 68 | return "SHADOWARRAY1D"; | 68 | return "SHADOWARRAY1D"; |
| 69 | case TextureType::Color2D: | 69 | case TextureType::Color2D: |
| 70 | case TextureType::Color2DRect: | ||
| 70 | return "SHADOW2D"; | 71 | return "SHADOW2D"; |
| 71 | case TextureType::ColorArray2D: | 72 | case TextureType::ColorArray2D: |
| 72 | return "SHADOWARRAY2D"; | 73 | return "SHADOWARRAY2D"; |
| @@ -86,6 +87,7 @@ std::string_view TextureType(IR::TextureInstInfo info) { | |||
| 86 | case TextureType::ColorArray1D: | 87 | case TextureType::ColorArray1D: |
| 87 | return "ARRAY1D"; | 88 | return "ARRAY1D"; |
| 88 | case TextureType::Color2D: | 89 | case TextureType::Color2D: |
| 90 | case TextureType::Color2DRect: | ||
| 89 | return "2D"; | 91 | return "2D"; |
| 90 | case TextureType::ColorArray2D: | 92 | case TextureType::ColorArray2D: |
| 91 | return "ARRAY2D"; | 93 | return "ARRAY2D"; |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_image.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_image.cpp index 6af7e3fe6..cecdbb9d6 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_image.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_image.cpp | |||
| @@ -466,6 +466,7 @@ void EmitImageQueryDimensions(EmitContext& ctx, IR::Inst& inst, const IR::Value& | |||
| 466 | case TextureType::ColorArray1D: | 466 | case TextureType::ColorArray1D: |
| 467 | case TextureType::Color2D: | 467 | case TextureType::Color2D: |
| 468 | case TextureType::ColorCube: | 468 | case TextureType::ColorCube: |
| 469 | case TextureType::Color2DRect: | ||
| 469 | return ctx.AddU32x4( | 470 | return ctx.AddU32x4( |
| 470 | "{}=uvec4(uvec2(textureSize({},int({}))),0u,uint(textureQueryLevels({})));", inst, | 471 | "{}=uvec4(uvec2(textureSize({},int({}))),0u,uint(textureQueryLevels({})));", inst, |
| 471 | texture, lod, texture); | 472 | texture, lod, texture); |
diff --git a/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp b/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp index 221b06328..c767a9dc3 100644 --- a/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp +++ b/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp | |||
| @@ -86,6 +86,7 @@ std::string_view SamplerType(TextureType type, bool is_depth) { | |||
| 86 | case TextureType::ColorArray1D: | 86 | case TextureType::ColorArray1D: |
| 87 | return "sampler1DArray"; | 87 | return "sampler1DArray"; |
| 88 | case TextureType::Color2D: | 88 | case TextureType::Color2D: |
| 89 | case TextureType::Color2DRect: | ||
| 89 | return "sampler2D"; | 90 | return "sampler2D"; |
| 90 | case TextureType::ColorArray2D: | 91 | case TextureType::ColorArray2D: |
| 91 | return "sampler2DArray"; | 92 | return "sampler2DArray"; |
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index d8d86c91a..fb5799c42 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp | |||
| @@ -453,6 +453,7 @@ Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& i | |||
| 453 | case TextureType::ColorArray1D: | 453 | case TextureType::ColorArray1D: |
| 454 | case TextureType::Color2D: | 454 | case TextureType::Color2D: |
| 455 | case TextureType::ColorCube: | 455 | case TextureType::ColorCube: |
| 456 | case TextureType::Color2DRect: | ||
| 456 | return ctx.OpCompositeConstruct(ctx.U32[4], ctx.OpImageQuerySizeLod(ctx.U32[2], image, lod), | 457 | return ctx.OpCompositeConstruct(ctx.U32[4], ctx.OpImageQuerySizeLod(ctx.U32[2], image, lod), |
| 457 | zero, mips()); | 458 | zero, mips()); |
| 458 | case TextureType::ColorArray2D: | 459 | case TextureType::ColorArray2D: |
diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 98dd9035a..aecc4c612 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp | |||
| @@ -41,6 +41,7 @@ Id ImageType(EmitContext& ctx, const TextureDescriptor& desc) { | |||
| 41 | case TextureType::ColorArray1D: | 41 | case TextureType::ColorArray1D: |
| 42 | return ctx.TypeImage(type, spv::Dim::Dim1D, depth, true, false, 1, format); | 42 | return ctx.TypeImage(type, spv::Dim::Dim1D, depth, true, false, 1, format); |
| 43 | case TextureType::Color2D: | 43 | case TextureType::Color2D: |
| 44 | case TextureType::Color2DRect: | ||
| 44 | return ctx.TypeImage(type, spv::Dim::Dim2D, depth, false, false, 1, format); | 45 | return ctx.TypeImage(type, spv::Dim::Dim2D, depth, false, false, 1, format); |
| 45 | case TextureType::ColorArray2D: | 46 | case TextureType::ColorArray2D: |
| 46 | return ctx.TypeImage(type, spv::Dim::Dim2D, depth, true, false, 1, format); | 47 | return ctx.TypeImage(type, spv::Dim::Dim2D, depth, true, false, 1, format); |
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp index d2b658bca..11086ed8c 100644 --- a/src/shader_recompiler/frontend/ir/ir_emitter.cpp +++ b/src/shader_recompiler/frontend/ir/ir_emitter.cpp | |||
| @@ -1832,6 +1832,11 @@ Value IREmitter::ImageQueryDimension(const Value& handle, const IR::U32& lod) { | |||
| 1832 | return Inst(op, handle, lod); | 1832 | return Inst(op, handle, lod); |
| 1833 | } | 1833 | } |
| 1834 | 1834 | ||
| 1835 | Value IREmitter::ImageQueryDimension(const Value& handle, const IR::U32& lod, | ||
| 1836 | TextureInstInfo info) { | ||
| 1837 | return Inst(Opcode::ImageQueryDimensions, Flags{info}, handle, lod); | ||
| 1838 | } | ||
| 1839 | |||
| 1835 | Value IREmitter::ImageQueryLod(const Value& handle, const Value& coords, TextureInstInfo info) { | 1840 | Value IREmitter::ImageQueryLod(const Value& handle, const Value& coords, TextureInstInfo info) { |
| 1836 | const Opcode op{handle.IsImmediate() ? Opcode::BoundImageQueryLod | 1841 | const Opcode op{handle.IsImmediate() ? Opcode::BoundImageQueryLod |
| 1837 | : Opcode::BindlessImageQueryLod}; | 1842 | : Opcode::BindlessImageQueryLod}; |
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.h b/src/shader_recompiler/frontend/ir/ir_emitter.h index c29bda558..25839a371 100644 --- a/src/shader_recompiler/frontend/ir/ir_emitter.h +++ b/src/shader_recompiler/frontend/ir/ir_emitter.h | |||
| @@ -315,6 +315,8 @@ public: | |||
| 315 | const F32& dref, const F32& lod, | 315 | const F32& dref, const F32& lod, |
| 316 | const Value& offset, TextureInstInfo info); | 316 | const Value& offset, TextureInstInfo info); |
| 317 | [[nodiscard]] Value ImageQueryDimension(const Value& handle, const IR::U32& lod); | 317 | [[nodiscard]] Value ImageQueryDimension(const Value& handle, const IR::U32& lod); |
| 318 | [[nodiscard]] Value ImageQueryDimension(const Value& handle, const IR::U32& lod, | ||
| 319 | TextureInstInfo info); | ||
| 318 | 320 | ||
| 319 | [[nodiscard]] Value ImageQueryLod(const Value& handle, const Value& coords, | 321 | [[nodiscard]] Value ImageQueryLod(const Value& handle, const Value& coords, |
| 320 | TextureInstInfo info); | 322 | TextureInstInfo info); |
diff --git a/src/shader_recompiler/ir_opt/rescaling_pass.cpp b/src/shader_recompiler/ir_opt/rescaling_pass.cpp index 0d5f2e4d8..9198fa5f2 100644 --- a/src/shader_recompiler/ir_opt/rescaling_pass.cpp +++ b/src/shader_recompiler/ir_opt/rescaling_pass.cpp | |||
| @@ -16,6 +16,7 @@ namespace { | |||
| 16 | switch (type) { | 16 | switch (type) { |
| 17 | case TextureType::Color2D: | 17 | case TextureType::Color2D: |
| 18 | case TextureType::ColorArray2D: | 18 | case TextureType::ColorArray2D: |
| 19 | case TextureType::Color2DRect: | ||
| 19 | return true; | 20 | return true; |
| 20 | case TextureType::Color1D: | 21 | case TextureType::Color1D: |
| 21 | case TextureType::ColorArray1D: | 22 | case TextureType::ColorArray1D: |
| @@ -132,7 +133,8 @@ void PatchImageQueryDimensions(IR::Block& block, IR::Inst& inst) { | |||
| 132 | const IR::U1 is_scaled{ir.IsTextureScaled(ir.Imm32(info.descriptor_index))}; | 133 | const IR::U1 is_scaled{ir.IsTextureScaled(ir.Imm32(info.descriptor_index))}; |
| 133 | switch (info.type) { | 134 | switch (info.type) { |
| 134 | case TextureType::Color2D: | 135 | case TextureType::Color2D: |
| 135 | case TextureType::ColorArray2D: { | 136 | case TextureType::ColorArray2D: |
| 137 | case TextureType::Color2DRect: { | ||
| 136 | const IR::Value new_inst{&*block.PrependNewInst(it, inst)}; | 138 | const IR::Value new_inst{&*block.PrependNewInst(it, inst)}; |
| 137 | const IR::U32 width{DownScale(ir, is_scaled, IR::U32{ir.CompositeExtract(new_inst, 0)})}; | 139 | const IR::U32 width{DownScale(ir, is_scaled, IR::U32{ir.CompositeExtract(new_inst, 0)})}; |
| 138 | const IR::U32 height{DownScale(ir, is_scaled, IR::U32{ir.CompositeExtract(new_inst, 1)})}; | 140 | const IR::U32 height{DownScale(ir, is_scaled, IR::U32{ir.CompositeExtract(new_inst, 1)})}; |
| @@ -163,6 +165,7 @@ void ScaleIntegerComposite(IR::IREmitter& ir, IR::Inst& inst, const IR::U1& is_s | |||
| 163 | const IR::U32 y{Scale(ir, is_scaled, IR::U32{ir.CompositeExtract(composite, 1)})}; | 165 | const IR::U32 y{Scale(ir, is_scaled, IR::U32{ir.CompositeExtract(composite, 1)})}; |
| 164 | switch (info.type) { | 166 | switch (info.type) { |
| 165 | case TextureType::Color2D: | 167 | case TextureType::Color2D: |
| 168 | case TextureType::Color2DRect: | ||
| 166 | inst.SetArg(index, ir.CompositeConstruct(x, y)); | 169 | inst.SetArg(index, ir.CompositeConstruct(x, y)); |
| 167 | break; | 170 | break; |
| 168 | case TextureType::ColorArray2D: { | 171 | case TextureType::ColorArray2D: { |
| @@ -193,6 +196,7 @@ void ScaleIntegerOffsetComposite(IR::IREmitter& ir, IR::Inst& inst, const IR::U1 | |||
| 193 | switch (info.type) { | 196 | switch (info.type) { |
| 194 | case TextureType::ColorArray2D: | 197 | case TextureType::ColorArray2D: |
| 195 | case TextureType::Color2D: | 198 | case TextureType::Color2D: |
| 199 | case TextureType::Color2DRect: | ||
| 196 | inst.SetArg(index, ir.CompositeConstruct(x, y)); | 200 | inst.SetArg(index, ir.CompositeConstruct(x, y)); |
| 197 | break; | 201 | break; |
| 198 | case TextureType::Color1D: | 202 | case TextureType::Color1D: |
| @@ -216,6 +220,7 @@ void SubScaleCoord(IR::IREmitter& ir, IR::Inst& inst, const IR::U1& is_scaled) { | |||
| 216 | const IR::U32 scaled_y{SubScale(ir, is_scaled, coord_y, IR::Attribute::PositionY)}; | 220 | const IR::U32 scaled_y{SubScale(ir, is_scaled, coord_y, IR::Attribute::PositionY)}; |
| 217 | switch (info.type) { | 221 | switch (info.type) { |
| 218 | case TextureType::Color2D: | 222 | case TextureType::Color2D: |
| 223 | case TextureType::Color2DRect: | ||
| 219 | inst.SetArg(1, ir.CompositeConstruct(scaled_x, scaled_y)); | 224 | inst.SetArg(1, ir.CompositeConstruct(scaled_x, scaled_y)); |
| 220 | break; | 225 | break; |
| 221 | case TextureType::ColorArray2D: { | 226 | case TextureType::ColorArray2D: { |
diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp index ca3e306e8..5cead5135 100644 --- a/src/shader_recompiler/ir_opt/texture_pass.cpp +++ b/src/shader_recompiler/ir_opt/texture_pass.cpp | |||
| @@ -362,6 +362,21 @@ private: | |||
| 362 | TextureDescriptors& texture_descriptors; | 362 | TextureDescriptors& texture_descriptors; |
| 363 | ImageDescriptors& image_descriptors; | 363 | ImageDescriptors& image_descriptors; |
| 364 | }; | 364 | }; |
| 365 | |||
| 366 | void PatchImageSampleImplicitLod(IR::Block& block, IR::Inst& inst) { | ||
| 367 | IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; | ||
| 368 | const auto info{inst.Flags<IR::TextureInstInfo>()}; | ||
| 369 | const IR::Value coord(inst.Arg(1)); | ||
| 370 | const IR::Value handle(ir.Imm32(0)); | ||
| 371 | const IR::U32 lod{ir.Imm32(0)}; | ||
| 372 | const IR::Value texture_size = ir.ImageQueryDimension(handle, lod, info); | ||
| 373 | inst.SetArg( | ||
| 374 | 1, ir.CompositeConstruct( | ||
| 375 | ir.FPMul(IR::F32(ir.CompositeExtract(coord, 0)), | ||
| 376 | ir.FPRecip(ir.ConvertUToF(32, 32, ir.CompositeExtract(texture_size, 0)))), | ||
| 377 | ir.FPMul(IR::F32(ir.CompositeExtract(coord, 1)), | ||
| 378 | ir.FPRecip(ir.ConvertUToF(32, 32, ir.CompositeExtract(texture_size, 1)))))); | ||
| 379 | } | ||
| 365 | } // Anonymous namespace | 380 | } // Anonymous namespace |
| 366 | 381 | ||
| 367 | void TexturePass(Environment& env, IR::Program& program) { | 382 | void TexturePass(Environment& env, IR::Program& program) { |
| @@ -399,6 +414,14 @@ void TexturePass(Environment& env, IR::Program& program) { | |||
| 399 | flags.type.Assign(ReadTextureType(env, cbuf)); | 414 | flags.type.Assign(ReadTextureType(env, cbuf)); |
| 400 | inst->SetFlags(flags); | 415 | inst->SetFlags(flags); |
| 401 | break; | 416 | break; |
| 417 | case IR::Opcode::ImageSampleImplicitLod: | ||
| 418 | if (flags.type == TextureType::Color2D) { | ||
| 419 | auto texture_type = ReadTextureType(env, cbuf); | ||
| 420 | if (texture_type == TextureType::Color2DRect) { | ||
| 421 | PatchImageSampleImplicitLod(*texture_inst.block, *texture_inst.inst); | ||
| 422 | } | ||
| 423 | } | ||
| 424 | break; | ||
| 402 | case IR::Opcode::ImageFetch: | 425 | case IR::Opcode::ImageFetch: |
| 403 | if (flags.type != TextureType::Color1D) { | 426 | if (flags.type != TextureType::Color1D) { |
| 404 | break; | 427 | break; |
diff --git a/src/shader_recompiler/shader_info.h b/src/shader_recompiler/shader_info.h index fd2ef5336..f5690805c 100644 --- a/src/shader_recompiler/shader_info.h +++ b/src/shader_recompiler/shader_info.h | |||
| @@ -24,8 +24,9 @@ enum class TextureType : u32 { | |||
| 24 | ColorCube, | 24 | ColorCube, |
| 25 | ColorArrayCube, | 25 | ColorArrayCube, |
| 26 | Buffer, | 26 | Buffer, |
| 27 | Color2DRect, | ||
| 27 | }; | 28 | }; |
| 28 | constexpr u32 NUM_TEXTURE_TYPES = 8; | 29 | constexpr u32 NUM_TEXTURE_TYPES = 9; |
| 29 | 30 | ||
| 30 | enum class ImageFormat : u32 { | 31 | enum class ImageFormat : u32 { |
| 31 | Typeless, | 32 | Typeless, |
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 8c0fffc67..99cd11d1e 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp | |||
| @@ -93,6 +93,7 @@ GLenum ImageTarget(Shader::TextureType type, int num_samples = 1) { | |||
| 93 | case Shader::TextureType::Color1D: | 93 | case Shader::TextureType::Color1D: |
| 94 | return GL_TEXTURE_1D; | 94 | return GL_TEXTURE_1D; |
| 95 | case Shader::TextureType::Color2D: | 95 | case Shader::TextureType::Color2D: |
| 96 | case Shader::TextureType::Color2DRect: | ||
| 96 | return is_multisampled ? GL_TEXTURE_2D_MULTISAMPLE : GL_TEXTURE_2D; | 97 | return is_multisampled ? GL_TEXTURE_2D_MULTISAMPLE : GL_TEXTURE_2D; |
| 97 | case Shader::TextureType::ColorCube: | 98 | case Shader::TextureType::ColorCube: |
| 98 | return GL_TEXTURE_CUBE_MAP; | 99 | return GL_TEXTURE_CUBE_MAP; |
| @@ -502,6 +503,7 @@ TextureCacheRuntime::TextureCacheRuntime(const Device& device_, ProgramManager& | |||
| 502 | set_view(Shader::TextureType::ColorArray1D, null_image_1d_array.handle); | 503 | set_view(Shader::TextureType::ColorArray1D, null_image_1d_array.handle); |
| 503 | set_view(Shader::TextureType::ColorArray2D, null_image_view_2d_array.handle); | 504 | set_view(Shader::TextureType::ColorArray2D, null_image_view_2d_array.handle); |
| 504 | set_view(Shader::TextureType::ColorArrayCube, null_image_cube_array.handle); | 505 | set_view(Shader::TextureType::ColorArrayCube, null_image_cube_array.handle); |
| 506 | set_view(Shader::TextureType::Color2DRect, null_image_view_2d.handle); | ||
| 505 | 507 | ||
| 506 | if (resolution.active) { | 508 | if (resolution.active) { |
| 507 | for (size_t i = 0; i < rescale_draw_fbos.size(); ++i) { | 509 | for (size_t i = 0; i < rescale_draw_fbos.size(); ++i) { |
| @@ -1110,6 +1112,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI | |||
| 1110 | flat_range.extent.layers = 1; | 1112 | flat_range.extent.layers = 1; |
| 1111 | [[fallthrough]]; | 1113 | [[fallthrough]]; |
| 1112 | case ImageViewType::e2D: | 1114 | case ImageViewType::e2D: |
| 1115 | case ImageViewType::Rect: | ||
| 1113 | if (True(flags & VideoCommon::ImageViewFlagBits::Slice)) { | 1116 | if (True(flags & VideoCommon::ImageViewFlagBits::Slice)) { |
| 1114 | // 2D and 2D array views on a 3D textures are used exclusively for render targets | 1117 | // 2D and 2D array views on a 3D textures are used exclusively for render targets |
| 1115 | ASSERT(info.range.extent.levels == 1); | 1118 | ASSERT(info.range.extent.levels == 1); |
| @@ -1135,9 +1138,6 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI | |||
| 1135 | SetupView(Shader::TextureType::ColorCube); | 1138 | SetupView(Shader::TextureType::ColorCube); |
| 1136 | SetupView(Shader::TextureType::ColorArrayCube); | 1139 | SetupView(Shader::TextureType::ColorArrayCube); |
| 1137 | break; | 1140 | break; |
| 1138 | case ImageViewType::Rect: | ||
| 1139 | UNIMPLEMENTED(); | ||
| 1140 | break; | ||
| 1141 | case ImageViewType::Buffer: | 1141 | case ImageViewType::Buffer: |
| 1142 | ASSERT(false); | 1142 | ASSERT(false); |
| 1143 | break; | 1143 | break; |
| @@ -1150,6 +1150,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI | |||
| 1150 | default_handle = Handle(Shader::TextureType::ColorArray1D); | 1150 | default_handle = Handle(Shader::TextureType::ColorArray1D); |
| 1151 | break; | 1151 | break; |
| 1152 | case ImageViewType::e2D: | 1152 | case ImageViewType::e2D: |
| 1153 | case ImageViewType::Rect: | ||
| 1153 | default_handle = Handle(Shader::TextureType::Color2D); | 1154 | default_handle = Handle(Shader::TextureType::Color2D); |
| 1154 | break; | 1155 | break; |
| 1155 | case ImageViewType::e2DArray: | 1156 | case ImageViewType::e2DArray: |
| @@ -1210,6 +1211,7 @@ GLuint ImageView::MakeView(Shader::TextureType view_type, GLenum view_format) { | |||
| 1210 | case Shader::TextureType::Color1D: | 1211 | case Shader::TextureType::Color1D: |
| 1211 | case Shader::TextureType::Color2D: | 1212 | case Shader::TextureType::Color2D: |
| 1212 | case Shader::TextureType::ColorCube: | 1213 | case Shader::TextureType::ColorCube: |
| 1214 | case Shader::TextureType::Color2DRect: | ||
| 1213 | view_range = flat_range; | 1215 | view_range = flat_range; |
| 1214 | break; | 1216 | break; |
| 1215 | case Shader::TextureType::ColorArray1D: | 1217 | case Shader::TextureType::ColorArray1D: |
| @@ -1250,7 +1252,6 @@ Sampler::Sampler(TextureCacheRuntime& runtime, const TSCEntry& config) { | |||
| 1250 | const GLint seamless = config.cubemap_interface_filtering ? GL_TRUE : GL_FALSE; | 1252 | const GLint seamless = config.cubemap_interface_filtering ? GL_TRUE : GL_FALSE; |
| 1251 | 1253 | ||
| 1252 | UNIMPLEMENTED_IF(config.cubemap_anisotropy != 1); | 1254 | UNIMPLEMENTED_IF(config.cubemap_anisotropy != 1); |
| 1253 | UNIMPLEMENTED_IF(config.float_coord_normalization != 0); | ||
| 1254 | 1255 | ||
| 1255 | sampler.Create(); | 1256 | sampler.Create(); |
| 1256 | const GLuint handle = sampler.handle; | 1257 | const GLuint handle = sampler.handle; |
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 43cc94fab..3adad5af4 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | |||
| @@ -434,7 +434,9 @@ void PipelineCache::LoadDiskResources(u64 title_id, std::stop_token stop_loading | |||
| 434 | state.statistics.get(), false)}; | 434 | state.statistics.get(), false)}; |
| 435 | 435 | ||
| 436 | std::scoped_lock lock{state.mutex}; | 436 | std::scoped_lock lock{state.mutex}; |
| 437 | graphics_cache.emplace(key, std::move(pipeline)); | 437 | if (pipeline) { |
| 438 | graphics_cache.emplace(key, std::move(pipeline)); | ||
| 439 | } | ||
| 438 | ++state.built; | 440 | ++state.built; |
| 439 | if (state.has_loaded) { | 441 | if (state.has_loaded) { |
| 440 | callback(VideoCore::LoadCallbackStage::Build, state.built, state.total); | 442 | callback(VideoCore::LoadCallbackStage::Build, state.built, state.total); |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 16463a892..caca79d79 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -230,6 +230,7 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) { | |||
| 230 | case Shader::TextureType::Color1D: | 230 | case Shader::TextureType::Color1D: |
| 231 | return VK_IMAGE_VIEW_TYPE_1D; | 231 | return VK_IMAGE_VIEW_TYPE_1D; |
| 232 | case Shader::TextureType::Color2D: | 232 | case Shader::TextureType::Color2D: |
| 233 | case Shader::TextureType::Color2DRect: | ||
| 233 | return VK_IMAGE_VIEW_TYPE_2D; | 234 | return VK_IMAGE_VIEW_TYPE_2D; |
| 234 | case Shader::TextureType::ColorCube: | 235 | case Shader::TextureType::ColorCube: |
| 235 | return VK_IMAGE_VIEW_TYPE_CUBE; | 236 | return VK_IMAGE_VIEW_TYPE_CUBE; |
| @@ -254,6 +255,7 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) { | |||
| 254 | case VideoCommon::ImageViewType::e1D: | 255 | case VideoCommon::ImageViewType::e1D: |
| 255 | return VK_IMAGE_VIEW_TYPE_1D; | 256 | return VK_IMAGE_VIEW_TYPE_1D; |
| 256 | case VideoCommon::ImageViewType::e2D: | 257 | case VideoCommon::ImageViewType::e2D: |
| 258 | case VideoCommon::ImageViewType::Rect: | ||
| 257 | return VK_IMAGE_VIEW_TYPE_2D; | 259 | return VK_IMAGE_VIEW_TYPE_2D; |
| 258 | case VideoCommon::ImageViewType::Cube: | 260 | case VideoCommon::ImageViewType::Cube: |
| 259 | return VK_IMAGE_VIEW_TYPE_CUBE; | 261 | return VK_IMAGE_VIEW_TYPE_CUBE; |
| @@ -265,9 +267,6 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) { | |||
| 265 | return VK_IMAGE_VIEW_TYPE_2D_ARRAY; | 267 | return VK_IMAGE_VIEW_TYPE_2D_ARRAY; |
| 266 | case VideoCommon::ImageViewType::CubeArray: | 268 | case VideoCommon::ImageViewType::CubeArray: |
| 267 | return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; | 269 | return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; |
| 268 | case VideoCommon::ImageViewType::Rect: | ||
| 269 | UNIMPLEMENTED_MSG("Rect image view"); | ||
| 270 | return VK_IMAGE_VIEW_TYPE_2D; | ||
| 271 | case VideoCommon::ImageViewType::Buffer: | 270 | case VideoCommon::ImageViewType::Buffer: |
| 272 | ASSERT_MSG(false, "Texture buffers can't be image views"); | 271 | ASSERT_MSG(false, "Texture buffers can't be image views"); |
| 273 | return VK_IMAGE_VIEW_TYPE_1D; | 272 | return VK_IMAGE_VIEW_TYPE_1D; |
| @@ -1579,6 +1578,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI | |||
| 1579 | break; | 1578 | break; |
| 1580 | case VideoCommon::ImageViewType::e2D: | 1579 | case VideoCommon::ImageViewType::e2D: |
| 1581 | case VideoCommon::ImageViewType::e2DArray: | 1580 | case VideoCommon::ImageViewType::e2DArray: |
| 1581 | case VideoCommon::ImageViewType::Rect: | ||
| 1582 | create(TextureType::Color2D, 1); | 1582 | create(TextureType::Color2D, 1); |
| 1583 | create(TextureType::ColorArray2D, std::nullopt); | 1583 | create(TextureType::ColorArray2D, std::nullopt); |
| 1584 | render_target = Handle(Shader::TextureType::ColorArray2D); | 1584 | render_target = Handle(Shader::TextureType::ColorArray2D); |
| @@ -1592,9 +1592,6 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI | |||
| 1592 | create(TextureType::ColorCube, 6); | 1592 | create(TextureType::ColorCube, 6); |
| 1593 | create(TextureType::ColorArrayCube, std::nullopt); | 1593 | create(TextureType::ColorArrayCube, std::nullopt); |
| 1594 | break; | 1594 | break; |
| 1595 | case VideoCommon::ImageViewType::Rect: | ||
| 1596 | UNIMPLEMENTED(); | ||
| 1597 | break; | ||
| 1598 | case VideoCommon::ImageViewType::Buffer: | 1595 | case VideoCommon::ImageViewType::Buffer: |
| 1599 | ASSERT(false); | 1596 | ASSERT(false); |
| 1600 | break; | 1597 | break; |
diff --git a/src/video_core/shader_environment.cpp b/src/video_core/shader_environment.cpp index c4e923bbf..808d88eec 100644 --- a/src/video_core/shader_environment.cpp +++ b/src/video_core/shader_environment.cpp | |||
| @@ -39,7 +39,11 @@ static Shader::TextureType ConvertType(const Tegra::Texture::TICEntry& entry) { | |||
| 39 | return Shader::TextureType::Color1D; | 39 | return Shader::TextureType::Color1D; |
| 40 | case Tegra::Texture::TextureType::Texture2D: | 40 | case Tegra::Texture::TextureType::Texture2D: |
| 41 | case Tegra::Texture::TextureType::Texture2DNoMipmap: | 41 | case Tegra::Texture::TextureType::Texture2DNoMipmap: |
| 42 | return Shader::TextureType::Color2D; | 42 | if (entry.normalized_coords) { |
| 43 | return Shader::TextureType::Color2D; | ||
| 44 | } else { | ||
| 45 | return Shader::TextureType::Color2DRect; | ||
| 46 | } | ||
| 43 | case Tegra::Texture::TextureType::Texture3D: | 47 | case Tegra::Texture::TextureType::Texture3D: |
| 44 | return Shader::TextureType::Color3D; | 48 | return Shader::TextureType::Color3D; |
| 45 | case Tegra::Texture::TextureType::TextureCubemap: | 49 | case Tegra::Texture::TextureType::TextureCubemap: |
| @@ -53,7 +57,8 @@ static Shader::TextureType ConvertType(const Tegra::Texture::TICEntry& entry) { | |||
| 53 | case Tegra::Texture::TextureType::TextureCubeArray: | 57 | case Tegra::Texture::TextureType::TextureCubeArray: |
| 54 | return Shader::TextureType::ColorArrayCube; | 58 | return Shader::TextureType::ColorArrayCube; |
| 55 | default: | 59 | default: |
| 56 | throw Shader::NotImplementedException("Unknown texture type"); | 60 | UNIMPLEMENTED(); |
| 61 | return Shader::TextureType::Color2D; | ||
| 57 | } | 62 | } |
| 58 | } | 63 | } |
| 59 | 64 | ||