|
|
|
@ -44,6 +44,17 @@ struct FormatTuple { |
|
|
|
bool compressed; |
|
|
|
}; |
|
|
|
|
|
|
|
static void ApplyTextureDefaults(GLenum target, u32 max_mip_level) { |
|
|
|
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
|
|
|
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
|
|
|
glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
|
|
|
glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
|
|
|
glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, max_mip_level - 1); |
|
|
|
if (max_mip_level == 1) { |
|
|
|
glTexParameterf(target, GL_TEXTURE_LOD_BIAS, 1000.0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void SurfaceParams::InitCacheParameters(Tegra::GPUVAddr gpu_addr_) { |
|
|
|
auto& memory_manager{Core::System::GetInstance().GPU().MemoryManager()}; |
|
|
|
const auto cpu_addr{memory_manager.GpuToCpuAddress(gpu_addr_)}; |
|
|
|
@ -530,6 +541,9 @@ CachedSurface::CachedSurface(const SurfaceParams& params) |
|
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
|
|
|
|
const auto& format_tuple = GetFormatTuple(params.pixel_format, params.component_type); |
|
|
|
gl_internal_format = format_tuple.internal_format; |
|
|
|
gl_is_compressed = format_tuple.compressed; |
|
|
|
|
|
|
|
if (!format_tuple.compressed) { |
|
|
|
// Only pre-create the texture for non-compressed textures.
|
|
|
|
switch (params.target) { |
|
|
|
@ -558,15 +572,7 @@ CachedSurface::CachedSurface(const SurfaceParams& params) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
glTexParameteri(SurfaceTargetToGL(params.target), GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
|
|
|
glTexParameteri(SurfaceTargetToGL(params.target), GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
|
|
|
glTexParameteri(SurfaceTargetToGL(params.target), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
|
|
|
glTexParameteri(SurfaceTargetToGL(params.target), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
|
|
|
glTexParameteri(SurfaceTargetToGL(params.target), GL_TEXTURE_MAX_LEVEL, |
|
|
|
params.max_mip_level - 1); |
|
|
|
if (params.max_mip_level == 1) { |
|
|
|
glTexParameterf(SurfaceTargetToGL(params.target), GL_TEXTURE_LOD_BIAS, 1000.0); |
|
|
|
} |
|
|
|
ApplyTextureDefaults(SurfaceTargetToGL(params.target), params.max_mip_level); |
|
|
|
|
|
|
|
LabelGLObject(GL_TEXTURE, texture.handle, params.addr, |
|
|
|
SurfaceParams::SurfaceTargetName(params.target)); |
|
|
|
@ -864,6 +870,31 @@ void CachedSurface::UploadGLMipmapTexture(u32 mip_map, GLuint read_fb_handle, |
|
|
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); |
|
|
|
} |
|
|
|
|
|
|
|
void CachedSurface::EnsureTextureView() { |
|
|
|
if (texture_view.handle != 0) |
|
|
|
return; |
|
|
|
// Compressed texture are not being created with immutable storage
|
|
|
|
UNIMPLEMENTED_IF(gl_is_compressed); |
|
|
|
|
|
|
|
const GLenum target{TargetLayer()}; |
|
|
|
|
|
|
|
texture_view.Create(); |
|
|
|
glTextureView(texture_view.handle, target, texture.handle, gl_internal_format, 0, |
|
|
|
params.max_mip_level, 0, 1); |
|
|
|
|
|
|
|
OpenGLState cur_state = OpenGLState::GetCurState(); |
|
|
|
const auto& old_tex = cur_state.texture_units[0]; |
|
|
|
SCOPE_EXIT({ |
|
|
|
cur_state.texture_units[0] = old_tex; |
|
|
|
cur_state.Apply(); |
|
|
|
}); |
|
|
|
cur_state.texture_units[0].texture = texture_view.handle; |
|
|
|
cur_state.texture_units[0].target = target; |
|
|
|
cur_state.Apply(); |
|
|
|
|
|
|
|
ApplyTextureDefaults(target, params.max_mip_level); |
|
|
|
} |
|
|
|
|
|
|
|
MICROPROFILE_DEFINE(OpenGL_TextureUL, "OpenGL", "Texture Upload", MP_RGB(128, 192, 64)); |
|
|
|
void CachedSurface::UploadGLTexture(GLuint read_fb_handle, GLuint draw_fb_handle) { |
|
|
|
if (params.type == SurfaceType::Fill) |
|
|
|
|