diff options
Diffstat (limited to 'src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp')
-rw-r--r-- | src/render/backends/gl/Qt3DSRenderBackendGLBase.cpp | 62 |
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)); } |