diff options
| author | 2022-08-10 10:10:32 +0800 | |
|---|---|---|
| committer | 2022-08-25 12:45:58 +0800 | |
| commit | b2a6dde4380a5526e9d936f92a9e3d6ad9393bfa (patch) | |
| tree | 0606caece955ac68899b71325b769a174af2f9f4 /src/video_core | |
| parent | Merge pull request #8734 from liamwhite/bors-is-my-best-friend (diff) | |
| download | yuzu-b2a6dde4380a5526e9d936f92a9e3d6ad9393bfa.tar.gz yuzu-b2a6dde4380a5526e9d936f92a9e3d6ad9393bfa.tar.xz yuzu-b2a6dde4380a5526e9d936f92a9e3d6ad9393bfa.zip | |
video_code: support rectangle texture
Diffstat (limited to 'src/video_core')
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 | ||