|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|