summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar FengChen2022-08-10 10:10:32 +0800
committerGravatar FengChen2022-08-25 12:45:58 +0800
commitb2a6dde4380a5526e9d936f92a9e3d6ad9393bfa (patch)
tree0606caece955ac68899b71325b769a174af2f9f4 /src/video_core
parentMerge pull request #8734 from liamwhite/bors-is-my-best-friend (diff)
downloadyuzu-b2a6dde4380a5526e9d936f92a9e3d6ad9393bfa.tar.gz
yuzu-b2a6dde4380a5526e9d936f92a9e3d6ad9393bfa.tar.xz
yuzu-b2a6dde4380a5526e9d936f92a9e3d6ad9393bfa.zip
video_code: support rectangle texture
Diffstat (limited to 'src/video_core')
-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
4 files changed, 18 insertions, 13 deletions
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