|
|
|
@ -41,18 +41,15 @@ struct FormatTuple {
|
|
|
|
|
GLenum format;
|
|
|
|
|
GLenum type;
|
|
|
|
|
bool compressed;
|
|
|
|
|
// How many pixels in the original texture are equivalent to one pixel in the compressed
|
|
|
|
|
// texture.
|
|
|
|
|
u32 compression_factor;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static constexpr std::array<FormatTuple, SurfaceParams::MaxPixelFormat> tex_format_tuples = {{
|
|
|
|
|
{GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, false, 1}, // ABGR8
|
|
|
|
|
{GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV, false, 1}, // B5G6R5
|
|
|
|
|
{GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, false, 1}, // A2B10G10R10
|
|
|
|
|
{GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_RGB, GL_UNSIGNED_INT_8_8_8_8, true, 16}, // DXT1
|
|
|
|
|
{GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, true, 16}, // DXT23
|
|
|
|
|
{GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, true, 16}, // DXT45
|
|
|
|
|
{GL_RGBA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, false}, // ABGR8
|
|
|
|
|
{GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5_REV, false}, // B5G6R5
|
|
|
|
|
{GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, false}, // A2B10G10R10
|
|
|
|
|
{GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_RGB, GL_UNSIGNED_INT_8_8_8_8, true}, // DXT1
|
|
|
|
|
{GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, true}, // DXT23
|
|
|
|
|
{GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, true}, // DXT45
|
|
|
|
|
}};
|
|
|
|
|
|
|
|
|
|
static const FormatTuple& GetFormatTuple(PixelFormat pixel_format, ComponentType component_type) {
|
|
|
|
@ -476,7 +473,7 @@ void CachedSurface::LoadGLBuffer(Tegra::GPUVAddr load_start, Tegra::GPUVAddr loa
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (gl_buffer == nullptr) {
|
|
|
|
|
gl_buffer_size = width * height * GetGLBytesPerPixel(pixel_format);
|
|
|
|
|
gl_buffer_size = GetActualWidth() * GetActualHeight() * GetGLBytesPerPixel(pixel_format);
|
|
|
|
|
gl_buffer.reset(new u8[gl_buffer_size]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -491,8 +488,9 @@ void CachedSurface::LoadGLBuffer(Tegra::GPUVAddr load_start, Tegra::GPUVAddr loa
|
|
|
|
|
std::memcpy(&gl_buffer[start_offset], texture_src_data + start_offset,
|
|
|
|
|
bytes_per_pixel * width * height);
|
|
|
|
|
} else {
|
|
|
|
|
morton_to_gl_fns[static_cast<size_t>(pixel_format)](
|
|
|
|
|
stride, block_height, height, &gl_buffer[0], addr, load_start, load_end);
|
|
|
|
|
morton_to_gl_fns[static_cast<size_t>(pixel_format)](GetActualWidth(), block_height,
|
|
|
|
|
GetActualHeight(), &gl_buffer[0], addr,
|
|
|
|
|
load_start, load_end);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -548,7 +546,8 @@ void CachedSurface::UploadGLTexture(const MathUtil::Rectangle<u32>& rect, GLuint
|
|
|
|
|
|
|
|
|
|
MICROPROFILE_SCOPE(OpenGL_TextureUL);
|
|
|
|
|
|
|
|
|
|
ASSERT(gl_buffer_size == width * height * GetGLBytesPerPixel(pixel_format));
|
|
|
|
|
ASSERT(gl_buffer_size ==
|
|
|
|
|
GetActualWidth() * GetActualHeight() * GetGLBytesPerPixel(pixel_format));
|
|
|
|
|
|
|
|
|
|
// Load data from memory to the surface
|
|
|
|
|
GLint x0 = static_cast<GLint>(rect.left);
|
|
|
|
@ -583,11 +582,9 @@ void CachedSurface::UploadGLTexture(const MathUtil::Rectangle<u32>& rect, GLuint
|
|
|
|
|
glActiveTexture(GL_TEXTURE0);
|
|
|
|
|
if (tuple.compressed) {
|
|
|
|
|
glCompressedTexImage2D(GL_TEXTURE_2D, 0, tuple.internal_format,
|
|
|
|
|
static_cast<GLsizei>(rect.GetWidth()),
|
|
|
|
|
static_cast<GLsizei>(rect.GetHeight()), 0,
|
|
|
|
|
rect.GetWidth() * rect.GetHeight() *
|
|
|
|
|
GetGLBytesPerPixel(pixel_format) / tuple.compression_factor,
|
|
|
|
|
&gl_buffer[buffer_offset]);
|
|
|
|
|
static_cast<GLsizei>(rect.GetWidth() * GetCompresssionFactor()),
|
|
|
|
|
static_cast<GLsizei>(rect.GetHeight() * GetCompresssionFactor()), 0,
|
|
|
|
|
size, &gl_buffer[buffer_offset]);
|
|
|
|
|
} else {
|
|
|
|
|
glTexSubImage2D(GL_TEXTURE_2D, 0, x0, y0, static_cast<GLsizei>(rect.GetWidth()),
|
|
|
|
|
static_cast<GLsizei>(rect.GetHeight()), tuple.format, tuple.type,
|
|
|
|
@ -1041,10 +1038,10 @@ Surface RasterizerCacheOpenGL::GetTextureSurface(const Tegra::Texture::FullTextu
|
|
|
|
|
|
|
|
|
|
SurfaceParams params;
|
|
|
|
|
params.addr = config.tic.Address();
|
|
|
|
|
params.width = config.tic.Width();
|
|
|
|
|
params.height = config.tic.Height();
|
|
|
|
|
params.is_tiled = config.tic.IsTiled();
|
|
|
|
|
params.pixel_format = SurfaceParams::PixelFormatFromTextureFormat(config.tic.format);
|
|
|
|
|
params.width = config.tic.Width() / params.GetCompresssionFactor();
|
|
|
|
|
params.height = config.tic.Height() / params.GetCompresssionFactor();
|
|
|
|
|
|
|
|
|
|
// TODO(Subv): Different types per component are not supported.
|
|
|
|
|
ASSERT(config.tic.r_type.Value() == config.tic.g_type.Value() &&
|
|
|
|
|