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:
 | 
			
		||||
            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;
 | 
			
		||||
    UNREACHABLE_MSG("Invalid texture filter mode={} and mipmap filter mode={}",
 | 
			
		||||
                    static_cast<u32>(filter_mode), static_cast<u32>(mipmap_filter_mode));
 | 
			
		||||
    return GL_NEAREST;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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,10 +78,9 @@ 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 {};
 | 
			
		||||
    }
 | 
			
		||||
    UNIMPLEMENTED_MSG("Unimplemented wrap mode={}", static_cast<u32>(wrap_mode));
 | 
			
		||||
    return {};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VkCompareOp DepthCompareFunction(Tegra::Texture::DepthCompareFunc depth_compare_func) {
 | 
			
		||||
@@ -288,10 +287,9 @@ 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 {};
 | 
			
		||||
    }
 | 
			
		||||
    UNIMPLEMENTED_MSG("Unimplemented topology={}", static_cast<u32>(topology));
 | 
			
		||||
    return {};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VkFormat VertexFormat(Maxwell::VertexAttribute::Type type, Maxwell::VertexAttribute::Size size) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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