Merge pull request #4081 from Morph1984/maxwell-to-gl-vk
maxwell_to_gl/vk: Miscellaneous changes
This commit is contained in:
		| @@ -46,10 +46,8 @@ inline GLenum VertexType(Maxwell::VertexAttribute attrib) { | ||||
|             return GL_UNSIGNED_INT; | ||||
|         case Maxwell::VertexAttribute::Size::Size_10_10_10_2: | ||||
|             return GL_UNSIGNED_INT_2_10_10_10_REV; | ||||
|         default: | ||||
|             LOG_ERROR(Render_OpenGL, "Unimplemented vertex size={}", attrib.SizeString()); | ||||
|             return {}; | ||||
|         } | ||||
|         break; | ||||
|     case Maxwell::VertexAttribute::Type::SignedInt: | ||||
|     case Maxwell::VertexAttribute::Type::SignedNorm: | ||||
|         switch (attrib.size) { | ||||
| @@ -70,10 +68,8 @@ inline GLenum VertexType(Maxwell::VertexAttribute attrib) { | ||||
|             return GL_INT; | ||||
|         case Maxwell::VertexAttribute::Size::Size_10_10_10_2: | ||||
|             return GL_INT_2_10_10_10_REV; | ||||
|         default: | ||||
|             LOG_ERROR(Render_OpenGL, "Unimplemented vertex size={}", attrib.SizeString()); | ||||
|             return {}; | ||||
|         } | ||||
|         break; | ||||
|     case Maxwell::VertexAttribute::Type::Float: | ||||
|         switch (attrib.size) { | ||||
|         case Maxwell::VertexAttribute::Size::Size_16: | ||||
| @@ -86,10 +82,8 @@ inline GLenum VertexType(Maxwell::VertexAttribute attrib) { | ||||
|         case Maxwell::VertexAttribute::Size::Size_32_32_32: | ||||
|         case Maxwell::VertexAttribute::Size::Size_32_32_32_32: | ||||
|             return GL_FLOAT; | ||||
|         default: | ||||
|             LOG_ERROR(Render_OpenGL, "Unimplemented vertex size={}", attrib.SizeString()); | ||||
|             return {}; | ||||
|         } | ||||
|         break; | ||||
|     case Maxwell::VertexAttribute::Type::UnsignedScaled: | ||||
|         switch (attrib.size) { | ||||
|         case Maxwell::VertexAttribute::Size::Size_8: | ||||
| @@ -102,10 +96,8 @@ inline GLenum VertexType(Maxwell::VertexAttribute attrib) { | ||||
|         case Maxwell::VertexAttribute::Size::Size_16_16_16: | ||||
|         case Maxwell::VertexAttribute::Size::Size_16_16_16_16: | ||||
|             return GL_UNSIGNED_SHORT; | ||||
|         default: | ||||
|             LOG_ERROR(Render_OpenGL, "Unimplemented vertex size={}", attrib.SizeString()); | ||||
|             return {}; | ||||
|         } | ||||
|         break; | ||||
|     case Maxwell::VertexAttribute::Type::SignedScaled: | ||||
|         switch (attrib.size) { | ||||
|         case Maxwell::VertexAttribute::Size::Size_8: | ||||
| @@ -118,14 +110,12 @@ inline GLenum VertexType(Maxwell::VertexAttribute attrib) { | ||||
|         case Maxwell::VertexAttribute::Size::Size_16_16_16: | ||||
|         case Maxwell::VertexAttribute::Size::Size_16_16_16_16: | ||||
|             return GL_SHORT; | ||||
|         default: | ||||
|             LOG_ERROR(Render_OpenGL, "Unimplemented vertex size={}", attrib.SizeString()); | ||||
|             return {}; | ||||
|         } | ||||
|     default: | ||||
|         LOG_ERROR(Render_OpenGL, "Unimplemented vertex type={}", attrib.TypeString()); | ||||
|         return {}; | ||||
|         break; | ||||
|     } | ||||
|     UNIMPLEMENTED_MSG("Unimplemented vertex type={} and size={}", attrib.TypeString(), | ||||
|                       attrib.SizeString()); | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| inline GLenum IndexFormat(Maxwell::IndexFormat index_format) { | ||||
| @@ -137,8 +127,7 @@ inline GLenum IndexFormat(Maxwell::IndexFormat index_format) { | ||||
|     case Maxwell::IndexFormat::UnsignedInt: | ||||
|         return GL_UNSIGNED_INT; | ||||
|     } | ||||
|     LOG_CRITICAL(Render_OpenGL, "Unimplemented index_format={}", static_cast<u32>(index_format)); | ||||
|     UNREACHABLE(); | ||||
|     UNREACHABLE_MSG("Invalid index_format={}", static_cast<u32>(index_format)); | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| @@ -180,10 +169,20 @@ inline GLenum PrimitiveTopology(Maxwell::PrimitiveTopology topology) { | ||||
| } | ||||
|  | ||||
| inline GLenum TextureFilterMode(Tegra::Texture::TextureFilter filter_mode, | ||||
|                                 Tegra::Texture::TextureMipmapFilter mip_filter_mode) { | ||||
|                                 Tegra::Texture::TextureMipmapFilter mipmap_filter_mode) { | ||||
|     switch (filter_mode) { | ||||
|     case Tegra::Texture::TextureFilter::Linear: { | ||||
|         switch (mip_filter_mode) { | ||||
|     case Tegra::Texture::TextureFilter::Nearest: | ||||
|         switch (mipmap_filter_mode) { | ||||
|         case Tegra::Texture::TextureMipmapFilter::None: | ||||
|             return GL_NEAREST; | ||||
|         case Tegra::Texture::TextureMipmapFilter::Nearest: | ||||
|             return GL_NEAREST_MIPMAP_NEAREST; | ||||
|         case Tegra::Texture::TextureMipmapFilter::Linear: | ||||
|             return GL_NEAREST_MIPMAP_LINEAR; | ||||
|         } | ||||
|         break; | ||||
|     case Tegra::Texture::TextureFilter::Linear: | ||||
|         switch (mipmap_filter_mode) { | ||||
|         case Tegra::Texture::TextureMipmapFilter::None: | ||||
|             return GL_LINEAR; | ||||
|         case Tegra::Texture::TextureMipmapFilter::Nearest: | ||||
| @@ -193,20 +192,9 @@ inline GLenum TextureFilterMode(Tegra::Texture::TextureFilter filter_mode, | ||||
|         } | ||||
|         break; | ||||
|     } | ||||
|     case Tegra::Texture::TextureFilter::Nearest: { | ||||
|         switch (mip_filter_mode) { | ||||
|         case Tegra::Texture::TextureMipmapFilter::None: | ||||
|     UNREACHABLE_MSG("Invalid texture filter mode={} and mipmap filter mode={}", | ||||
|                     static_cast<u32>(filter_mode), static_cast<u32>(mipmap_filter_mode)); | ||||
|     return GL_NEAREST; | ||||
|         case Tegra::Texture::TextureMipmapFilter::Nearest: | ||||
|             return GL_NEAREST_MIPMAP_NEAREST; | ||||
|         case Tegra::Texture::TextureMipmapFilter::Linear: | ||||
|             return GL_NEAREST_MIPMAP_LINEAR; | ||||
|         } | ||||
|         break; | ||||
|     } | ||||
|     } | ||||
|     LOG_ERROR(Render_OpenGL, "Unimplemented texture filter mode={}", static_cast<u32>(filter_mode)); | ||||
|     return GL_LINEAR; | ||||
| } | ||||
|  | ||||
| inline GLenum WrapMode(Tegra::Texture::WrapMode wrap_mode) { | ||||
| @@ -229,10 +217,9 @@ inline GLenum WrapMode(Tegra::Texture::WrapMode wrap_mode) { | ||||
|         } else { | ||||
|             return GL_MIRROR_CLAMP_TO_EDGE; | ||||
|         } | ||||
|     default: | ||||
|         LOG_ERROR(Render_OpenGL, "Unimplemented texture wrap mode={}", static_cast<u32>(wrap_mode)); | ||||
|         return GL_REPEAT; | ||||
|     } | ||||
|     UNIMPLEMENTED_MSG("Unimplemented texture wrap mode={}", static_cast<u32>(wrap_mode)); | ||||
|     return GL_REPEAT; | ||||
| } | ||||
|  | ||||
| inline GLenum DepthCompareFunc(Tegra::Texture::DepthCompareFunc func) { | ||||
| @@ -254,8 +241,7 @@ inline GLenum DepthCompareFunc(Tegra::Texture::DepthCompareFunc func) { | ||||
|     case Tegra::Texture::DepthCompareFunc::Always: | ||||
|         return GL_ALWAYS; | ||||
|     } | ||||
|     LOG_ERROR(Render_OpenGL, "Unimplemented texture depth compare function ={}", | ||||
|               static_cast<u32>(func)); | ||||
|     UNIMPLEMENTED_MSG("Unimplemented texture depth compare function={}", static_cast<u32>(func)); | ||||
|     return GL_GREATER; | ||||
| } | ||||
|  | ||||
| @@ -277,7 +263,7 @@ inline GLenum BlendEquation(Maxwell::Blend::Equation equation) { | ||||
|     case Maxwell::Blend::Equation::MaxGL: | ||||
|         return GL_MAX; | ||||
|     } | ||||
|     LOG_ERROR(Render_OpenGL, "Unimplemented blend equation={}", static_cast<u32>(equation)); | ||||
|     UNIMPLEMENTED_MSG("Unimplemented blend equation={}", static_cast<u32>(equation)); | ||||
|     return GL_FUNC_ADD; | ||||
| } | ||||
|  | ||||
| @@ -341,7 +327,7 @@ inline GLenum BlendFunc(Maxwell::Blend::Factor factor) { | ||||
|     case Maxwell::Blend::Factor::OneMinusConstantAlphaGL: | ||||
|         return GL_ONE_MINUS_CONSTANT_ALPHA; | ||||
|     } | ||||
|     LOG_ERROR(Render_OpenGL, "Unimplemented blend factor={}", static_cast<u32>(factor)); | ||||
|     UNIMPLEMENTED_MSG("Unimplemented blend factor={}", static_cast<u32>(factor)); | ||||
|     return GL_ZERO; | ||||
| } | ||||
|  | ||||
| @@ -361,7 +347,7 @@ inline GLenum SwizzleSource(Tegra::Texture::SwizzleSource source) { | ||||
|     case Tegra::Texture::SwizzleSource::OneFloat: | ||||
|         return GL_ONE; | ||||
|     } | ||||
|     LOG_ERROR(Render_OpenGL, "Unimplemented swizzle source={}", static_cast<u32>(source)); | ||||
|     UNIMPLEMENTED_MSG("Unimplemented swizzle source={}", static_cast<u32>(source)); | ||||
|     return GL_ZERO; | ||||
| } | ||||
|  | ||||
| @@ -392,7 +378,7 @@ inline GLenum ComparisonOp(Maxwell::ComparisonOp comparison) { | ||||
|     case Maxwell::ComparisonOp::AlwaysOld: | ||||
|         return GL_ALWAYS; | ||||
|     } | ||||
|     LOG_ERROR(Render_OpenGL, "Unimplemented comparison op={}", static_cast<u32>(comparison)); | ||||
|     UNIMPLEMENTED_MSG("Unimplemented comparison op={}", static_cast<u32>(comparison)); | ||||
|     return GL_ALWAYS; | ||||
| } | ||||
|  | ||||
| @@ -423,7 +409,7 @@ inline GLenum StencilOp(Maxwell::StencilOp stencil) { | ||||
|     case Maxwell::StencilOp::DecrWrapOGL: | ||||
|         return GL_DECR_WRAP; | ||||
|     } | ||||
|     LOG_ERROR(Render_OpenGL, "Unimplemented stencil op={}", static_cast<u32>(stencil)); | ||||
|     UNIMPLEMENTED_MSG("Unimplemented stencil op={}", static_cast<u32>(stencil)); | ||||
|     return GL_KEEP; | ||||
| } | ||||
|  | ||||
| @@ -434,7 +420,7 @@ inline GLenum FrontFace(Maxwell::FrontFace front_face) { | ||||
|     case Maxwell::FrontFace::CounterClockWise: | ||||
|         return GL_CCW; | ||||
|     } | ||||
|     LOG_ERROR(Render_OpenGL, "Unimplemented front face cull={}", static_cast<u32>(front_face)); | ||||
|     UNIMPLEMENTED_MSG("Unimplemented front face cull={}", static_cast<u32>(front_face)); | ||||
|     return GL_CCW; | ||||
| } | ||||
|  | ||||
| @@ -447,7 +433,7 @@ inline GLenum CullFace(Maxwell::CullFace cull_face) { | ||||
|     case Maxwell::CullFace::FrontAndBack: | ||||
|         return GL_FRONT_AND_BACK; | ||||
|     } | ||||
|     LOG_ERROR(Render_OpenGL, "Unimplemented cull face={}", static_cast<u32>(cull_face)); | ||||
|     UNIMPLEMENTED_MSG("Unimplemented cull face={}", static_cast<u32>(cull_face)); | ||||
|     return GL_BACK; | ||||
| } | ||||
|  | ||||
| @@ -486,7 +472,7 @@ inline GLenum LogicOp(Maxwell::LogicOperation operation) { | ||||
|     case Maxwell::LogicOperation::Set: | ||||
|         return GL_SET; | ||||
|     } | ||||
|     LOG_ERROR(Render_OpenGL, "Unimplemented logic operation={}", static_cast<u32>(operation)); | ||||
|     UNIMPLEMENTED_MSG("Unimplemented logic operation={}", static_cast<u32>(operation)); | ||||
|     return GL_COPY; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -21,29 +21,29 @@ namespace Sampler { | ||||
|  | ||||
| VkFilter Filter(Tegra::Texture::TextureFilter filter) { | ||||
|     switch (filter) { | ||||
|     case Tegra::Texture::TextureFilter::Linear: | ||||
|         return VK_FILTER_LINEAR; | ||||
|     case Tegra::Texture::TextureFilter::Nearest: | ||||
|         return VK_FILTER_NEAREST; | ||||
|     case Tegra::Texture::TextureFilter::Linear: | ||||
|         return VK_FILTER_LINEAR; | ||||
|     } | ||||
|     UNIMPLEMENTED_MSG("Unimplemented sampler filter={}", static_cast<u32>(filter)); | ||||
|     UNREACHABLE_MSG("Invalid sampler filter={}", static_cast<u32>(filter)); | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| VkSamplerMipmapMode MipmapMode(Tegra::Texture::TextureMipmapFilter mipmap_filter) { | ||||
|     switch (mipmap_filter) { | ||||
|     case Tegra::Texture::TextureMipmapFilter::None: | ||||
|         // TODO(Rodrigo): None seems to be mapped to OpenGL's mag and min filters without mipmapping | ||||
|         // (e.g. GL_NEAREST and GL_LINEAR). Vulkan doesn't have such a thing, find out if we have to | ||||
|         // use an image view with a single mipmap level to emulate this. | ||||
|         return VK_SAMPLER_MIPMAP_MODE_LINEAR; | ||||
|         ; | ||||
|     case Tegra::Texture::TextureMipmapFilter::Linear: | ||||
|         return VK_SAMPLER_MIPMAP_MODE_LINEAR; | ||||
|         // There are no Vulkan filter modes that directly correspond to OpenGL minification filters | ||||
|         // of GL_LINEAR or GL_NEAREST, but they can be emulated using | ||||
|         // VK_SAMPLER_MIPMAP_MODE_NEAREST, minLod = 0, and maxLod = 0.25, and using minFilter = | ||||
|         // VK_FILTER_LINEAR or minFilter = VK_FILTER_NEAREST, respectively. | ||||
|         return VK_SAMPLER_MIPMAP_MODE_NEAREST; | ||||
|     case Tegra::Texture::TextureMipmapFilter::Nearest: | ||||
|         return VK_SAMPLER_MIPMAP_MODE_NEAREST; | ||||
|     case Tegra::Texture::TextureMipmapFilter::Linear: | ||||
|         return VK_SAMPLER_MIPMAP_MODE_LINEAR; | ||||
|     } | ||||
|     UNIMPLEMENTED_MSG("Unimplemented sampler mipmap mode={}", static_cast<u32>(mipmap_filter)); | ||||
|     UNREACHABLE_MSG("Invalid sampler mipmap mode={}", static_cast<u32>(mipmap_filter)); | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| @@ -78,11 +78,10 @@ VkSamplerAddressMode WrapMode(const VKDevice& device, Tegra::Texture::WrapMode w | ||||
|     case Tegra::Texture::WrapMode::MirrorOnceBorder: | ||||
|         UNIMPLEMENTED(); | ||||
|         return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE; | ||||
|     default: | ||||
|     } | ||||
|     UNIMPLEMENTED_MSG("Unimplemented wrap mode={}", static_cast<u32>(wrap_mode)); | ||||
|     return {}; | ||||
| } | ||||
| } | ||||
|  | ||||
| VkCompareOp DepthCompareFunction(Tegra::Texture::DepthCompareFunc depth_compare_func) { | ||||
|     switch (depth_compare_func) { | ||||
| @@ -288,11 +287,10 @@ VkPrimitiveTopology PrimitiveTopology([[maybe_unused]] const VKDevice& device, | ||||
|         return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; | ||||
|     case Maxwell::PrimitiveTopology::Patches: | ||||
|         return VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; | ||||
|     default: | ||||
|     } | ||||
|     UNIMPLEMENTED_MSG("Unimplemented topology={}", static_cast<u32>(topology)); | ||||
|     return {}; | ||||
| } | ||||
| } | ||||
|  | ||||
| VkFormat VertexFormat(Maxwell::VertexAttribute::Type type, Maxwell::VertexAttribute::Size size) { | ||||
|     switch (type) { | ||||
|   | ||||
| @@ -9,6 +9,8 @@ | ||||
| #include "video_core/renderer_vulkan/wrapper.h" | ||||
| #include "video_core/textures/texture.h" | ||||
|  | ||||
| using Tegra::Texture::TextureMipmapFilter; | ||||
|  | ||||
| namespace Vulkan { | ||||
|  | ||||
| namespace { | ||||
| @@ -63,8 +65,8 @@ vk::Sampler VKSamplerCache::CreateSampler(const Tegra::Texture::TSCEntry& tsc) c | ||||
|     ci.maxAnisotropy = tsc.GetMaxAnisotropy(); | ||||
|     ci.compareEnable = tsc.depth_compare_enabled; | ||||
|     ci.compareOp = MaxwellToVK::Sampler::DepthCompareFunction(tsc.depth_compare_func); | ||||
|     ci.minLod = tsc.GetMinLod(); | ||||
|     ci.maxLod = tsc.GetMaxLod(); | ||||
|     ci.minLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.0f : tsc.GetMinLod(); | ||||
|     ci.maxLod = tsc.mipmap_filter == TextureMipmapFilter::None ? 0.25f : tsc.GetMaxLod(); | ||||
|     ci.borderColor = arbitrary_borders ? VK_BORDER_COLOR_INT_CUSTOM_EXT : ConvertBorderColor(color); | ||||
|     ci.unnormalizedCoordinates = VK_FALSE; | ||||
|     return device.GetLogical().CreateSampler(ci); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user