/*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
break;
}
+ // GLES 3.0 depth and stencil formats
+ case Pixel::DEPTH_UNSIGNED_INT:
+ {
+ glFormat = GL_DEPTH_COMPONENT;
+ pixelDataType = GL_UNSIGNED_INT;
+ break;
+ }
+
+ case Pixel::DEPTH_FLOAT:
+ {
+ glFormat = GL_DEPTH_COMPONENT;
+ pixelDataType = GL_FLOAT;
+ break;
+ }
+
+ case Pixel::DEPTH_STENCIL:
+ {
+ glFormat = GL_DEPTH_STENCIL;
+ pixelDataType = GL_UNSIGNED_INT_24_8;
+ break;
+ }
+
case Pixel::INVALID:
{
DALI_LOG_ERROR( "Invalid pixel format for bitmap\n" );
glInternalFormat = GL_R11F_G11F_B10F;
break;
}
+ case Pixel::DEPTH_FLOAT:
+ {
+ glInternalFormat = GL_DEPTH_COMPONENT32F;
+ break;
+ }
+ case Pixel::DEPTH_STENCIL:
+ {
+ glInternalFormat = GL_DEPTH24_STENCIL8;
+ break;
+ }
default:
{
glInternalFormat = glFormat;
case Pixel::BGRA8888:
case Pixel::RGB16F:
case Pixel::RGB32F:
+ case Pixel::DEPTH_UNSIGNED_INT:
+ case Pixel::DEPTH_FLOAT:
+ case Pixel::DEPTH_STENCIL:
case Pixel::INVALID:
{
return false;
uint8_t* buffer( pixelData->GetBuffer() );
//This buffer is only used if manually converting from RGB to RGBA
- uint8_t* tempBuffer(0);
+ std::vector< uint8_t > tempBuffer;
//Retrieves the pixel data element type, the gl format and gl internal format of the data contained in the PixelData object.
GLenum glFormat;
( params.width != ( mWidth / ( 1 << params.mipmap ) ) ) ||
( params.height != ( mHeight / ( 1 << params.mipmap ) ) ) );
- bool convert = ( ( glFormat == GL_RGB ) && ( mGlFormat == GL_RGBA ) );
-#if DALI_GLES_VERSION >= 30
- // Don't convert manually from RGB to RGBA if GLES >= 3.0 and a sub-image is uploaded.
- convert = convert && !isSubImage;
-#endif
-
- if( convert )
+ if( context.TextureRequiresConverting( glFormat, mGlFormat, isSubImage ) )
{
uint32_t dataSize = static_cast< uint32_t >( params.width ) * params.height;
- tempBuffer = new uint8_t[dataSize*4u];
+ //reserve() does not allocate the memory on some systems so can crash if not populated using push_back
+ tempBuffer.resize( dataSize * 4u );
for( uint32_t i = 0u; i < dataSize; ++i )
{
tempBuffer[i*4u] = buffer[i*3u];
tempBuffer[i*4u+3] = 0xFF;
}
- buffer = tempBuffer;
+ buffer = &tempBuffer[0];
glFormat = mGlFormat; // Set the glFormat to GL_RGBA
}
glFormat, static_cast<GLsizei>( pixelData->GetBufferSize() ), buffer );
}
}
-
-
- //Destroy temp buffer used for conversion RGB->RGBA
- delete[] tempBuffer;
}
bool Texture::Bind( Context& context, uint32_t textureUnit, Render::Sampler* sampler )
}
}
-#if DALI_GLES_VERSION >= 30
- //In GLES 3.0 we do not need to upload all of the mipmap levels, but GL_TEXTURE_MAX_LEVEL must be set
if(mMaxMipMapLevel)
{
context.TexParameteri( mTarget, GL_TEXTURE_MAX_LEVEL, mMaxMipMapLevel );
}
-#endif
-
}
}
-bool Texture::HasAlphaChannel()
+bool Texture::HasAlphaChannel() const
{
return mHasAlpha;
}