mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Split texture initialization code from upload
This commit is contained in:
parent
9ff07df45e
commit
427a7e4998
1 changed files with 56 additions and 50 deletions
|
@ -110,8 +110,10 @@ public:
|
||||||
}
|
}
|
||||||
TEST_GL_ERROR(Driver);
|
TEST_GL_ERROR(Driver);
|
||||||
|
|
||||||
|
initTexture();
|
||||||
|
|
||||||
for (size_t i = 0; i < tmpImages->size(); ++i)
|
for (size_t i = 0; i < tmpImages->size(); ++i)
|
||||||
uploadTexture(true, i, 0, (*tmpImages)[i]->getData());
|
uploadTexture(i, 0, (*tmpImages)[i]->getData());
|
||||||
|
|
||||||
if (HasMipMaps) {
|
if (HasMipMaps) {
|
||||||
for (size_t i = 0; i < tmpImages->size(); ++i)
|
for (size_t i = 0; i < tmpImages->size(); ++i)
|
||||||
|
@ -206,50 +208,13 @@ public:
|
||||||
StatesCache.WrapW = ETC_CLAMP_TO_EDGE;
|
StatesCache.WrapW = ETC_CLAMP_TO_EDGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (Type) {
|
initTexture();
|
||||||
case ETT_2D:
|
|
||||||
GL.TexImage2D(GL_TEXTURE_2D, 0, InternalFormat, Size.Width, Size.Height, 0, PixelFormat, PixelType, 0);
|
|
||||||
break;
|
|
||||||
case ETT_2D_MS: {
|
|
||||||
// glTexImage2DMultisample is supported by OpenGL 3.2+
|
|
||||||
// glTexStorage2DMultisample is supported by OpenGL 4.3+ and OpenGL ES 3.1+
|
|
||||||
#ifdef IRR_COMPILE_GL_COMMON // legacy driver
|
|
||||||
constexpr bool use_gl_impl = true;
|
|
||||||
#else
|
|
||||||
const bool use_gl_impl = Driver->Version.Spec != OpenGLSpec::ES;
|
|
||||||
#endif
|
|
||||||
GLint max_samples = 0;
|
|
||||||
GL.GetIntegerv(GL_MAX_SAMPLES, &max_samples);
|
|
||||||
MSAA = core::min_(MSAA, (u8)max_samples);
|
|
||||||
|
|
||||||
if (use_gl_impl)
|
|
||||||
GL.TexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, MSAA, InternalFormat, Size.Width, Size.Height, GL_TRUE);
|
|
||||||
else
|
|
||||||
GL.TexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, MSAA, InternalFormat, Size.Width, Size.Height, GL_TRUE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ETT_CUBEMAP:
|
|
||||||
GL.TexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, InternalFormat, Size.Width, Size.Height, 0, PixelFormat, PixelType, 0);
|
|
||||||
GL.TexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, InternalFormat, Size.Width, Size.Height, 0, PixelFormat, PixelType, 0);
|
|
||||||
GL.TexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, InternalFormat, Size.Width, Size.Height, 0, PixelFormat, PixelType, 0);
|
|
||||||
GL.TexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, InternalFormat, Size.Width, Size.Height, 0, PixelFormat, PixelType, 0);
|
|
||||||
GL.TexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, InternalFormat, Size.Width, Size.Height, 0, PixelFormat, PixelType, 0);
|
|
||||||
GL.TexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, InternalFormat, Size.Width, Size.Height, 0, PixelFormat, PixelType, 0);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
_IRR_DEBUG_BREAK_IF(1)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!name.empty())
|
if (!name.empty())
|
||||||
Driver->irrGlObjectLabel(GL_TEXTURE, TextureName, name.c_str());
|
Driver->irrGlObjectLabel(GL_TEXTURE, TextureName, name.c_str());
|
||||||
|
|
||||||
Driver->getCacheHandler()->getTextureCache().set(0, prevTexture);
|
Driver->getCacheHandler()->getTextureCache().set(0, prevTexture);
|
||||||
if (TEST_GL_ERROR(Driver)) {
|
TEST_GL_ERROR(Driver);
|
||||||
char msg[256];
|
|
||||||
snprintf_irr(msg, 256, "COpenGLCoreTexture: InternalFormat:0x%04x PixelFormat:0x%04x", (int)InternalFormat, (int)PixelFormat);
|
|
||||||
os::Printer::log(msg, ELL_ERROR);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~COpenGLCoreTexture()
|
virtual ~COpenGLCoreTexture()
|
||||||
|
@ -405,7 +370,7 @@ public:
|
||||||
const COpenGLCoreTexture *prevTexture = Driver->getCacheHandler()->getTextureCache().get(0);
|
const COpenGLCoreTexture *prevTexture = Driver->getCacheHandler()->getTextureCache().get(0);
|
||||||
Driver->getCacheHandler()->getTextureCache().set(0, this);
|
Driver->getCacheHandler()->getTextureCache().set(0, this);
|
||||||
|
|
||||||
uploadTexture(false, LockLayer, MipLevelStored, LockImage->getData());
|
uploadTexture(LockLayer, MipLevelStored, LockImage->getData());
|
||||||
|
|
||||||
Driver->getCacheHandler()->getTextureCache().set(0, prevTexture);
|
Driver->getCacheHandler()->getTextureCache().set(0, prevTexture);
|
||||||
}
|
}
|
||||||
|
@ -530,7 +495,54 @@ protected:
|
||||||
Pitch = Size.Width * IImage::getBitsPerPixelFromFormat(ColorFormat) / 8;
|
Pitch = Size.Width * IImage::getBitsPerPixelFromFormat(ColorFormat) / 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
void uploadTexture(bool initTexture, u32 layer, u32 level, void *data)
|
void initTexture()
|
||||||
|
{
|
||||||
|
// Compressed textures cannot be pre-allocated and are initialized on upload
|
||||||
|
if (IImage::isCompressedFormat(ColorFormat)) {
|
||||||
|
_IRR_DEBUG_BREAK_IF(IsRenderTarget)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (Type) {
|
||||||
|
case ETT_2D:
|
||||||
|
GL.TexImage2D(TextureType, 0, InternalFormat,
|
||||||
|
Size.Width, Size.Height, 0, PixelFormat, PixelType, 0);
|
||||||
|
TEST_GL_ERROR(Driver);
|
||||||
|
break;
|
||||||
|
case ETT_2D_MS: {
|
||||||
|
GLint max_samples = 0;
|
||||||
|
GL.GetIntegerv(GL_MAX_SAMPLES, &max_samples);
|
||||||
|
MSAA = core::min_(MSAA, (u8)max_samples);
|
||||||
|
|
||||||
|
// glTexImage2DMultisample is supported by OpenGL 3.2+
|
||||||
|
// glTexStorage2DMultisample is supported by OpenGL 4.3+ and OpenGL ES 3.1+
|
||||||
|
#ifdef IRR_COMPILE_GL_COMMON // legacy driver
|
||||||
|
constexpr bool use_gl_impl = true;
|
||||||
|
#else
|
||||||
|
const bool use_gl_impl = Driver->Version.Spec != OpenGLSpec::ES;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (use_gl_impl)
|
||||||
|
GL.TexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, MSAA, InternalFormat, Size.Width, Size.Height, GL_TRUE);
|
||||||
|
else
|
||||||
|
GL.TexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, MSAA, InternalFormat, Size.Width, Size.Height, GL_TRUE);
|
||||||
|
TEST_GL_ERROR(Driver);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ETT_CUBEMAP:
|
||||||
|
for (u32 i = 0; i < 6; i++) {
|
||||||
|
GL.TexImage2D(getTextureTarget(i), 0, InternalFormat,
|
||||||
|
Size.Width, Size.Height, 0, PixelFormat, PixelType, 0);
|
||||||
|
TEST_GL_ERROR(Driver);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_IRR_DEBUG_BREAK_IF(1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void uploadTexture(u32 layer, u32 level, void *data)
|
||||||
{
|
{
|
||||||
if (!data)
|
if (!data)
|
||||||
return;
|
return;
|
||||||
|
@ -560,9 +572,6 @@ protected:
|
||||||
switch (TextureType) {
|
switch (TextureType) {
|
||||||
case GL_TEXTURE_2D:
|
case GL_TEXTURE_2D:
|
||||||
case GL_TEXTURE_CUBE_MAP:
|
case GL_TEXTURE_CUBE_MAP:
|
||||||
if (initTexture)
|
|
||||||
GL.TexImage2D(tmpTextureType, level, InternalFormat, width, height, 0, PixelFormat, PixelType, tmpData);
|
|
||||||
else
|
|
||||||
GL.TexSubImage2D(tmpTextureType, level, 0, 0, width, height, PixelFormat, PixelType, tmpData);
|
GL.TexSubImage2D(tmpTextureType, level, 0, 0, width, height, PixelFormat, PixelType, tmpData);
|
||||||
TEST_GL_ERROR(Driver);
|
TEST_GL_ERROR(Driver);
|
||||||
break;
|
break;
|
||||||
|
@ -578,10 +587,7 @@ protected:
|
||||||
switch (TextureType) {
|
switch (TextureType) {
|
||||||
case GL_TEXTURE_2D:
|
case GL_TEXTURE_2D:
|
||||||
case GL_TEXTURE_CUBE_MAP:
|
case GL_TEXTURE_CUBE_MAP:
|
||||||
if (initTexture)
|
|
||||||
Driver->irrGlCompressedTexImage2D(tmpTextureType, level, InternalFormat, width, height, 0, dataSize, data);
|
Driver->irrGlCompressedTexImage2D(tmpTextureType, level, InternalFormat, width, height, 0, dataSize, data);
|
||||||
else
|
|
||||||
Driver->irrGlCompressedTexSubImage2D(tmpTextureType, level, 0, 0, width, height, PixelFormat, dataSize, data);
|
|
||||||
TEST_GL_ERROR(Driver);
|
TEST_GL_ERROR(Driver);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue