summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Fernando S2022-08-31 10:40:45 +0200
committerGravatar GitHub2022-08-31 10:40:45 +0200
commita83a5d2e4c8932df864dd4cea2b04d87a12c8760 (patch)
tree53bd0ce10e965110c7811bd227443fd51e054eff
parentMerge pull request #8809 from german77/finally_is_fixed (diff)
parentvideo_code: support rectangle texture (diff)
downloadyuzu-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 '')
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm_image.cpp2
-rw-r--r--src/shader_recompiler/backend/glsl/emit_glsl_image.cpp1
-rw-r--r--src/shader_recompiler/backend/glsl/glsl_emit_context.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_image.cpp1
-rw-r--r--src/shader_recompiler/backend/spirv/spirv_emit_context.cpp1
-rw-r--r--src/shader_recompiler/frontend/ir/ir_emitter.cpp5
-rw-r--r--src/shader_recompiler/frontend/ir/ir_emitter.h2
-rw-r--r--src/shader_recompiler/ir_opt/rescaling_pass.cpp7
-rw-r--r--src/shader_recompiler/ir_opt/texture_pass.cpp23
-rw-r--r--src/shader_recompiler/shader_info.h3
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp9
-rw-r--r--src/video_core/renderer_vulkan/vk_pipeline_cache.cpp4
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp9
-rw-r--r--src/video_core/shader_environment.cpp9
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
1835Value IREmitter::ImageQueryDimension(const Value& handle, const IR::U32& lod,
1836 TextureInstInfo info) {
1837 return Inst(Opcode::ImageQueryDimensions, Flags{info}, handle, lod);
1838}
1839
1835Value IREmitter::ImageQueryLod(const Value& handle, const Value& coords, TextureInstInfo info) { 1840Value 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
366void 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
367void TexturePass(Environment& env, IR::Program& program) { 382void 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};
28constexpr u32 NUM_TEXTURE_TYPES = 8; 29constexpr u32 NUM_TEXTURE_TYPES = 9;
29 30
30enum class ImageFormat : u32 { 31enum 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