OpenGLDevice: Fix texture creation issues w/o texture storage

This commit is contained in:
Stenzek 2023-12-19 21:14:00 +10:00
parent 717e0665ae
commit 4942964e2f
No known key found for this signature in database

View file

@ -140,45 +140,69 @@ bool OpenGLTexture::Create(u32 width, u32 height, u32 layers, u32 levels, u32 sa
}
else
{
if (UseTextureStorage(false))
const bool use_texture_storage = UseTextureStorage(false);
if (use_texture_storage)
{
if (layers > 1)
glTexStorage3D(target, levels, gl_internal_format, width, height, layers);
else
glTexStorage2D(target, levels, gl_internal_format, width, height);
}
if (!use_texture_storage || data)
{
const u32 pixel_size = GetPixelSize(format);
const u32 alignment = ((data_pitch % 4) == 0) ? 4 : (((data_pitch % 2) == 0) ? 2 : 1);
if (data)
{
glPixelStorei(GL_UNPACK_ROW_LENGTH, data_pitch / pixel_size);
if (alignment != 4)
glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
}
const u8* data_ptr = static_cast<const u8*>(data);
u32 current_width = width;
u32 current_height = height;
for (u32 i = 0; i < levels; i++)
{
if (use_texture_storage)
{
if (layers > 1)
glTexSubImage3D(target, i, 0, 0, 0, current_width, current_height, layers, gl_format, gl_type, data_ptr);
else
glTexSubImage2D(target, i, 0, 0, current_width, current_height, gl_format, gl_type, data_ptr);
}
else
{
if (layers > 1)
glTexImage3D(target, i, gl_internal_format, current_width, current_height, layers, 0, gl_format, gl_type,
data_ptr);
else
glTexImage2D(target, i, gl_internal_format, current_width, current_height, 0, gl_format, gl_type, data_ptr);
}
if (data_ptr)
data_ptr += data_pitch * current_width;
current_width = (current_width > 1) ? (current_width / 2u) : current_width;
current_height = (current_height > 1) ? (current_height / 2u) : current_height;
// TODO: Incorrect assumption.
data_pitch = pixel_size * current_width;
}
if (data)
{
glPixelStorei(GL_UNPACK_ROW_LENGTH, data_pitch / GetPixelSize(format));
// TODO: Fix data for mipmaps here.
if (layers > 1)
glTexSubImage3D(target, 0, 0, 0, 0, width, height, layers, gl_format, gl_type, data);
else
glTexSubImage2D(target, 0, 0, 0, width, height, gl_format, gl_type, data);
if (alignment != 4)
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
}
}
else
if (!use_texture_storage)
{
if (data)
glPixelStorei(GL_UNPACK_ROW_LENGTH, data_pitch / GetPixelSize(format));
for (u32 i = 0; i < levels; i++)
{
// TODO: Fix data pointer here.
if (layers > 1)
glTexImage3D(target, i, gl_internal_format, width, height, layers, 0, gl_format, gl_type, data);
else
glTexImage2D(target, i, gl_internal_format, width, height, 0, gl_format, gl_type, data);
}
if (data)
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, levels);
glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, levels - 1);
}
}
@ -400,9 +424,9 @@ std::unique_ptr<GPUSampler> OpenGLDevice::CreateSampler(const GPUSampler::Config
glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER,
filters[mipmap_on_off][static_cast<u8>(config.mip_filter.GetValue())]
[static_cast<u8>(config.min_filter.GetValue())]);
glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER,
filters[mipmap_on_off][static_cast<u8>(config.mip_filter.GetValue())]
[static_cast<u8>(config.mag_filter.GetValue())]);
glSamplerParameteri(
sampler, GL_TEXTURE_MAG_FILTER,
filters[0][static_cast<u8>(config.mip_filter.GetValue())][static_cast<u8>(config.mag_filter.GetValue())]);
glSamplerParameterf(sampler, GL_TEXTURE_MIN_LOD, static_cast<float>(config.min_lod));
glSamplerParameterf(sampler, GL_TEXTURE_MAX_LOD, static_cast<float>(config.max_lod));
glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, config.GetBorderFloatColor().data());