summaryrefslogtreecommitdiffstats
path: root/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp')
-rw-r--r--src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp62
1 files changed, 42 insertions, 20 deletions
diff --git a/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp b/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp
index ca40d93..aeaf79b 100644
--- a/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp
+++ b/src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp
@@ -920,9 +920,9 @@ void NVRenderBackendGLBase::ReleaseTexture(NVRenderBackendTextureObject to)
}
void NVRenderBackendGLBase::SetTextureData2D(
- NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
- NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, QT3DSI32 border,
- NVRenderTextureFormats::Enum format, const void *hostPtr)
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format, const void *hostPtr)
{
GLuint texID = HandleToID_cast(GLuint, size_t, to);
GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
@@ -934,11 +934,14 @@ void NVRenderBackendGLBase::SetTextureData2D(
internalFormat = m_Conversion.replaceDeprecatedTextureFormat(GetRenderContextType(),
internalFormat, swizzleMode);
- GLenum glformat = 0, glInternalFormat = 0, gltype = GL_UNSIGNED_BYTE;
+ GLenum glformat = 0;
+ GLenum glInternalFormat = 0;
+ GLenum gltype = GL_UNSIGNED_BYTE;
- if (NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat))
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat)) {
m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), internalFormat,
glformat, gltype, glInternalFormat);
+ }
if (conversionRequired) {
GLenum dummy;
@@ -948,28 +951,36 @@ void NVRenderBackendGLBase::SetTextureData2D(
m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
gltype, glInternalFormat);
glInternalFormat = m_Conversion.fromCompressedTextureFormatToGL(internalFormat);
- } else if (NVRenderTextureFormats::isDepthTextureFormat(format))
+ } else if (NVRenderTextureFormats::isDepthTextureFormat(format)) {
m_Conversion.fromDepthTextureFormatToGL(GetRenderContextType(), format, glformat,
gltype, glInternalFormat);
+ }
- GL_CALL_FUNCTION(glTexImage2D(glTarget, level, glInternalFormat, (GLsizei)width, (GLsizei)height,
- border, glformat, gltype, hostPtr));
+ if (hostPtr == nullptr && !NVRenderTextureFormats::isDepthTextureFormat(internalFormat)) {
+ void *tempPtr = calloc(width * height,
+ NVRenderTextureFormats::getSizeofFormat(internalFormat));
+ GL_CALL_FUNCTION(glTexImage2D(glTarget, level, glInternalFormat, (GLsizei)width,
+ (GLsizei)height, border, glformat, gltype, tempPtr));
+ free(tempPtr);
+ } else {
+ GL_CALL_FUNCTION(glTexImage2D(glTarget, level, glInternalFormat, (GLsizei)width,
+ (GLsizei)height, border, glformat, gltype, hostPtr));
+ }
GL_CALL_FUNCTION(glBindTexture(glTarget, 0));
}
// This will look very SetTextureData2D, but the target for glBindTexture will be different from
-// the target for
-// glTexImage2D.
+// the target for glTexImage2D.
void NVRenderBackendGLBase::SetTextureDataCubeFace(
- NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
- NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, QT3DSI32 border,
- NVRenderTextureFormats::Enum format, const void *hostPtr)
+ NVRenderBackendTextureObject to, NVRenderTextureTargetType::Enum target, QT3DSU32 level,
+ NVRenderTextureFormats::Enum internalFormat, size_t width, size_t height, QT3DSI32 border,
+ NVRenderTextureFormats::Enum format, const void *hostPtr)
{
GLuint texID = HandleToID_cast(GLuint, size_t, to);
GLenum glTarget = m_Conversion.fromTextureTargetToGL(target);
GLenum glTexTarget =
- m_Conversion.fromTextureTargetToGL(NVRenderTextureTargetType::TextureCube);
+ m_Conversion.fromTextureTargetToGL(NVRenderTextureTargetType::TextureCube);
GL_CALL_FUNCTION(glActiveTexture(GL_TEXTURE0));
GL_CALL_FUNCTION(glBindTexture(glTexTarget, texID));
bool conversionRequired = format != internalFormat;
@@ -978,12 +989,14 @@ void NVRenderBackendGLBase::SetTextureDataCubeFace(
internalFormat = m_Conversion.replaceDeprecatedTextureFormat(GetRenderContextType(),
internalFormat, swizzleMode);
- GLenum glformat = 0, glInternalFormat = 0, gltype = GL_UNSIGNED_BYTE;
+ GLenum glformat = 0;
+ GLenum glInternalFormat = 0;
+ GLenum gltype = GL_UNSIGNED_BYTE;
- if (NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat))
+ if (NVRenderTextureFormats::isUncompressedTextureFormat(internalFormat)) {
m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), internalFormat,
glformat, gltype, glInternalFormat);
-
+ }
if (conversionRequired) {
GLenum dummy;
@@ -993,16 +1006,25 @@ void NVRenderBackendGLBase::SetTextureDataCubeFace(
m_Conversion.fromUncompressedTextureFormatToGL(GetRenderContextType(), format, glformat,
gltype, glInternalFormat);
glInternalFormat = m_Conversion.fromCompressedTextureFormatToGL(internalFormat);
- } else if (NVRenderTextureFormats::isDepthTextureFormat(format))
+ } else if (NVRenderTextureFormats::isDepthTextureFormat(format)) {
m_Conversion.fromDepthTextureFormatToGL(GetRenderContextType(), format, glformat,
gltype, glInternalFormat);
+ }
// for es2 internal format must be same as format
if (GetRenderContextType() == NVRenderContextValues::GLES2)
glInternalFormat = glformat;
- GL_CALL_FUNCTION(glTexImage2D(glTarget, level, glInternalFormat, (GLsizei)width, (GLsizei)height,
- border, glformat, gltype, hostPtr));
+ if (hostPtr == nullptr && !NVRenderTextureFormats::isDepthTextureFormat(internalFormat)) {
+ void *tempPtr = calloc(width * height,
+ NVRenderTextureFormats::getSizeofFormat(internalFormat));
+ GL_CALL_FUNCTION(glTexImage2D(glTarget, level, glInternalFormat, (GLsizei)width,
+ (GLsizei)height, border, glformat, gltype, tempPtr));
+ free(tempPtr);
+ } else {
+ GL_CALL_FUNCTION(glTexImage2D(glTarget, level, glInternalFormat, (GLsizei)width,
+ (GLsizei)height, border, glformat, gltype, hostPtr));
+ }
GL_CALL_FUNCTION(glBindTexture(glTexTarget, 0));
}