diff options
Diffstat (limited to 'src/libGLESv2/renderer/d3d/TextureD3D.cpp')
-rw-r--r-- | src/libGLESv2/renderer/d3d/TextureD3D.cpp | 224 |
1 files changed, 147 insertions, 77 deletions
diff --git a/src/libGLESv2/renderer/d3d/TextureD3D.cpp b/src/libGLESv2/renderer/d3d/TextureD3D.cpp index 4cbe5d65..b33c471b 100644 --- a/src/libGLESv2/renderer/d3d/TextureD3D.cpp +++ b/src/libGLESv2/renderer/d3d/TextureD3D.cpp @@ -12,6 +12,7 @@ #include "libEGL/Surface.h" #include "libGLESv2/Buffer.h" #include "libGLESv2/Framebuffer.h" +#include "libGLESv2/Texture.h" #include "libGLESv2/main.h" #include "libGLESv2/formatutils.h" #include "libGLESv2/renderer/BufferImpl.h" @@ -58,12 +59,6 @@ TextureD3D::~TextureD3D() { } -TextureD3D *TextureD3D::makeTextureD3D(TextureImpl *texture) -{ - ASSERT(HAS_DYNAMIC_TYPE(TextureD3D*, texture)); - return static_cast<TextureD3D*>(texture); -} - GLint TextureD3D::getBaseLevelWidth() const { const Image *baseImage = getBaseLevelImage(); @@ -250,15 +245,17 @@ TextureStorageInterface *TextureD3D_2D::getNativeTexture() return storage; } -Image *TextureD3D_2D::getImage(int level) const +Image *TextureD3D_2D::getImage(int level, int layer) const { ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); + ASSERT(layer == 0); return mImageArray[level]; } -void TextureD3D_2D::setUsage(GLenum usage) +GLsizei TextureD3D_2D::getLayerCount(int level) const { - mUsage = usage; + ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); + return 1; } GLsizei TextureD3D_2D::getWidth(GLint level) const @@ -298,17 +295,21 @@ bool TextureD3D_2D::isDepth(GLint level) const return gl::GetInternalFormatInfo(getInternalFormat(level)).depthBits > 0; } -void TextureD3D_2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) +void TextureD3D_2D::setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) { + ASSERT(target == GL_TEXTURE_2D && depth == 1); + GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, type); bool fastUnpacked = false; + redefineImage(level, sizedInternalFormat, width, height); + // Attempt a fast gpu copy of the pixel data to the surface if (isFastUnpackable(unpack, sizedInternalFormat) && isLevelComplete(level)) { // Will try to create RT storage if it does not exist - RenderTarget *destRenderTarget = getRenderTarget(level); + RenderTarget *destRenderTarget = getRenderTarget(level, 0); gl::Box destArea(0, 0, 0, getWidth(level), getHeight(level), 1); if (destRenderTarget && fastUnpackPixels(unpack, pixels, destArea, sizedInternalFormat, type, destRenderTarget)) @@ -326,18 +327,25 @@ void TextureD3D_2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum } } -void TextureD3D_2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels) +void TextureD3D_2D::setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels) { + ASSERT(target == GL_TEXTURE_2D && depth == 1); + + // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly + redefineImage(level, format, width, height); + TextureD3D::setCompressedImage(imageSize, pixels, mImageArray[level]); } -void TextureD3D_2D::subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) +void TextureD3D_2D::subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) { + ASSERT(target == GL_TEXTURE_2D && depth == 1 && zoffset == 0); + bool fastUnpacked = false; if (isFastUnpackable(unpack, getInternalFormat(level)) && isLevelComplete(level)) { - RenderTarget *renderTarget = getRenderTarget(level); + RenderTarget *renderTarget = getRenderTarget(level, 0); gl::Box destArea(xoffset, yoffset, 0, width, height, 1); if (renderTarget && fastUnpackPixels(unpack, pixels, destArea, getInternalFormat(level), type, renderTarget)) @@ -355,16 +363,23 @@ void TextureD3D_2D::subImage(GLint level, GLint xoffset, GLint yoffset, GLsizei } } -void TextureD3D_2D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels) +void TextureD3D_2D::subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels) { + ASSERT(target == GL_TEXTURE_2D && depth == 1 && zoffset == 0); + if (TextureD3D::subImageCompressed(xoffset, yoffset, 0, width, height, 1, format, imageSize, pixels, mImageArray[level])) { commitRect(level, xoffset, yoffset, width, height); } } -void TextureD3D_2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source) +void TextureD3D_2D::copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source) { + ASSERT(target == GL_TEXTURE_2D); + + GLenum sizedInternalFormat = gl::GetSizedInternalFormat(format, GL_UNSIGNED_BYTE); + redefineImage(level, sizedInternalFormat, width, height); + if (!mImageArray[level]->isRenderableFormat()) { mImageArray[level]->copy(0, 0, 0, x, y, width, height, source); @@ -390,6 +405,8 @@ void TextureD3D_2D::copyImage(GLint level, GLenum format, GLint x, GLint y, GLsi void TextureD3D_2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source) { + ASSERT(target == GL_TEXTURE_2D && zoffset == 0); + // can only make our texture storage to a render target if level 0 is defined (with a width & height) and // the current level we're copying to is defined (with appropriate format, width & height) bool canCreateRenderTarget = isLevelComplete(level) && isLevelComplete(0); @@ -420,8 +437,10 @@ void TextureD3D_2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLin } } -void TextureD3D_2D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) +void TextureD3D_2D::storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { + ASSERT(target == GL_TEXTURE_2D && depth == 1); + for (int level = 0; level < levels; level++) { GLsizei levelWidth = std::max(1, width >> level); @@ -538,7 +557,14 @@ void TextureD3D_2D::releaseTexImage() void TextureD3D_2D::generateMipmaps() { + // Purge array levels 1 through q and reset them to represent the generated mipmap levels. int levelCount = mipLevels(); + for (int level = 1; level < levelCount; level++) + { + redefineImage(level, getBaseLevelInternalFormat(), + std::max(getBaseLevelWidth() >> level, 1), + std::max(getBaseLevelHeight() >> level, 1)); + } if (mTexStorage && mTexStorage->isRenderTarget()) { @@ -558,13 +584,16 @@ void TextureD3D_2D::generateMipmaps() } } -unsigned int TextureD3D_2D::getRenderTargetSerial(GLint level) +unsigned int TextureD3D_2D::getRenderTargetSerial(GLint level, GLint layer) { + ASSERT(layer == 0); return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(level) : 0); } -RenderTarget *TextureD3D_2D::getRenderTarget(GLint level) +RenderTarget *TextureD3D_2D::getRenderTarget(GLint level, GLint layer) { + ASSERT(layer == 0); + // ensure the underlying texture is created if (!ensureRenderTarget()) { @@ -582,8 +611,10 @@ RenderTarget *TextureD3D_2D::getRenderTarget(GLint level) return mTexStorage->getRenderTarget(level); } -RenderTarget *TextureD3D_2D::getDepthSencil(GLint level) +RenderTarget *TextureD3D_2D::getDepthStencil(GLint level, GLint layer) { + ASSERT(layer == 0); + // ensure the underlying texture is created if (!ensureRenderTarget()) { @@ -866,32 +897,37 @@ TextureStorageInterface *TextureD3D_Cube::getNativeTexture() return storage; } -Image *TextureD3D_Cube::getImage(GLenum target, int level) const +Image *TextureD3D_Cube::getImage(int level, int layer) const { ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); - return mImageArray[targetToIndex(target)][level]; + ASSERT(layer < 6); + return mImageArray[layer][level]; } -void TextureD3D_Cube::setUsage(GLenum usage) +GLsizei TextureD3D_Cube::getLayerCount(int level) const { - mUsage = usage; + ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); + return 6; } -GLenum TextureD3D_Cube::getInternalFormat(GLenum target, GLint level) const +GLenum TextureD3D_Cube::getInternalFormat(GLint level, GLint layer) const { if (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS) - return mImageArray[targetToIndex(target)][level]->getInternalFormat(); + return mImageArray[layer][level]->getInternalFormat(); else return GL_NONE; } -bool TextureD3D_Cube::isDepth(GLenum target, GLint level) const +bool TextureD3D_Cube::isDepth(GLint level, GLint layer) const { - return gl::GetInternalFormatInfo(getInternalFormat(target, level)).depthBits > 0; + return gl::GetInternalFormatInfo(getInternalFormat(level, layer)).depthBits > 0; } -void TextureD3D_Cube::setImage(int faceIndex, GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) +void TextureD3D_Cube::setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) { + ASSERT(depth == 1); + + int faceIndex = gl::TextureCubeMap::targetToLayerIndex(target); GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, type); redefineImage(faceIndex, level, sizedInternalFormat, width, height); @@ -899,27 +935,36 @@ void TextureD3D_Cube::setImage(int faceIndex, GLint level, GLsizei width, GLsize TextureD3D::setImage(unpack, type, pixels, mImageArray[faceIndex][level]); } -void TextureD3D_Cube::setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels) +void TextureD3D_Cube::setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels) { + ASSERT(depth == 1); + // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly - int faceIndex = targetToIndex(target); + int faceIndex = gl::TextureCubeMap::targetToLayerIndex(target); + redefineImage(faceIndex, level, format, width, height); TextureD3D::setCompressedImage(imageSize, pixels, mImageArray[faceIndex][level]); } -void TextureD3D_Cube::subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) +void TextureD3D_Cube::subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) { - int faceIndex = targetToIndex(target); + ASSERT(depth == 1 && zoffset == 0); + + int faceIndex = gl::TextureCubeMap::targetToLayerIndex(target); + if (TextureD3D::subImage(xoffset, yoffset, 0, width, height, 1, format, type, unpack, pixels, mImageArray[faceIndex][level])) { commitRect(faceIndex, level, xoffset, yoffset, width, height); } } -void TextureD3D_Cube::subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels) +void TextureD3D_Cube::subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels) { - int faceIndex = targetToIndex(target); + ASSERT(depth == 1 && zoffset == 0); + + int faceIndex = gl::TextureCubeMap::targetToLayerIndex(target); + if (TextureD3D::subImageCompressed(xoffset, yoffset, 0, width, height, 1, format, imageSize, pixels, mImageArray[faceIndex][level])) { commitRect(faceIndex, level, xoffset, yoffset, width, height); @@ -928,7 +973,7 @@ void TextureD3D_Cube::subImageCompressed(GLenum target, GLint level, GLint xoffs void TextureD3D_Cube::copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source) { - int faceIndex = targetToIndex(target); + int faceIndex = gl::TextureCubeMap::targetToLayerIndex(target); GLenum sizedInternalFormat = gl::GetSizedInternalFormat(format, GL_UNSIGNED_BYTE); redefineImage(faceIndex, level, sizedInternalFormat, width, height); @@ -960,7 +1005,7 @@ void TextureD3D_Cube::copyImage(GLenum target, GLint level, GLenum format, GLint void TextureD3D_Cube::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source) { - int faceIndex = targetToIndex(target); + int faceIndex = gl::TextureCubeMap::targetToLayerIndex(target); // We can only make our texture storage to a render target if the level we're copying *to* is complete // and the base level is cube-complete. The base level must be cube complete (common case) because we cannot @@ -992,11 +1037,14 @@ void TextureD3D_Cube::copySubImage(GLenum target, GLint level, GLint xoffset, GL } } -void TextureD3D_Cube::storage(GLsizei levels, GLenum internalformat, GLsizei size) +void TextureD3D_Cube::storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { + ASSERT(width == height); + ASSERT(depth == 1); + for (int level = 0; level < levels; level++) { - GLsizei mipSize = std::max(1, size >> level); + GLsizei mipSize = std::max(1, width >> level); for (int faceIndex = 0; faceIndex < 6; faceIndex++) { mImageArray[faceIndex][level]->redefine(mRenderer, GL_TEXTURE_CUBE_MAP, internalformat, mipSize, mipSize, 1, true); @@ -1013,7 +1061,7 @@ void TextureD3D_Cube::storage(GLsizei levels, GLenum internalformat, GLsizei siz mImmutable = true; - setCompleteTexStorage(new TextureStorageInterfaceCube(mRenderer, internalformat, IsRenderTargetUsage(mUsage), size, levels)); + setCompleteTexStorage(new TextureStorageInterfaceCube(mRenderer, internalformat, IsRenderTargetUsage(mUsage), width, levels)); } bool TextureD3D_Cube::isSamplerComplete(const gl::SamplerState &samplerState) const @@ -1023,7 +1071,7 @@ bool TextureD3D_Cube::isSamplerComplete(const gl::SamplerState &samplerState) co bool mipmapping = IsMipmapFiltered(samplerState); // TODO(geofflang): use context's texture caps - if (!mRenderer->getRendererTextureCaps().get(getInternalFormat(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0)).filterable) + if (!mRenderer->getRendererTextureCaps().get(getInternalFormat(0, 0)).filterable) { if (samplerState.magFilter != GL_NEAREST || (samplerState.minFilter != GL_NEAREST && samplerState.minFilter != GL_NEAREST_MIPMAP_NEAREST)) @@ -1123,13 +1171,15 @@ void TextureD3D_Cube::generateMipmaps() } } -unsigned int TextureD3D_Cube::getRenderTargetSerial(GLenum target, GLint level) +unsigned int TextureD3D_Cube::getRenderTargetSerial(GLint level, GLint layer) { + GLenum target = gl::TextureCubeMap::layerIndexToTarget(layer); return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(target, level) : 0); } -RenderTarget *TextureD3D_Cube::getRenderTarget(GLenum target, GLint level) +RenderTarget *TextureD3D_Cube::getRenderTarget(GLint level, GLint layer) { + GLenum target = gl::TextureCubeMap::layerIndexToTarget(layer); ASSERT(gl::IsCubemapTextureTarget(target)); // ensure the underlying texture is created @@ -1138,10 +1188,10 @@ RenderTarget *TextureD3D_Cube::getRenderTarget(GLenum target, GLint level) return NULL; } - updateStorageFaceLevel(targetToIndex(target), level); + updateStorageFaceLevel(layer, level); // ensure this is NOT a depth texture - if (isDepth(target, level)) + if (isDepth(level, layer)) { return NULL; } @@ -1149,8 +1199,9 @@ RenderTarget *TextureD3D_Cube::getRenderTarget(GLenum target, GLint level) return mTexStorage->getRenderTarget(target, level); } -RenderTarget *TextureD3D_Cube::getDepthStencil(GLenum target, GLint level) +RenderTarget *TextureD3D_Cube::getDepthStencil(GLint level, GLint layer) { + GLenum target = gl::TextureCubeMap::layerIndexToTarget(layer); ASSERT(gl::IsCubemapTextureTarget(target)); // ensure the underlying texture is created @@ -1159,10 +1210,10 @@ RenderTarget *TextureD3D_Cube::getDepthStencil(GLenum target, GLint level) return NULL; } - updateStorageFaceLevel(targetToIndex(target), level); + updateStorageFaceLevel(layer, level); // ensure this is a depth texture - if (!isDepth(target, level)) + if (!isDepth(level, layer)) { return NULL; } @@ -1170,17 +1221,6 @@ RenderTarget *TextureD3D_Cube::getDepthStencil(GLenum target, GLint level) return mTexStorage->getRenderTarget(target, level); } -int TextureD3D_Cube::targetToIndex(GLenum target) -{ - META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_X - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 1); - META_ASSERT(GL_TEXTURE_CUBE_MAP_POSITIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 2); - META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 3); - META_ASSERT(GL_TEXTURE_CUBE_MAP_POSITIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 4); - META_ASSERT(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z - GL_TEXTURE_CUBE_MAP_POSITIVE_X == 5); - - return target - GL_TEXTURE_CUBE_MAP_POSITIVE_X; -} - void TextureD3D_Cube::initializeStorage(bool renderTarget) { // Only initialize the first time this texture is used as a render target or shader resource @@ -1457,15 +1497,17 @@ TextureStorageInterface *TextureD3D_3D::getNativeTexture() return storage; } -Image *TextureD3D_3D::getImage(int level) const +Image *TextureD3D_3D::getImage(int level, int layer) const { ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); + ASSERT(layer == 0); return mImageArray[level]; } -void TextureD3D_3D::setUsage(GLenum usage) +GLsizei TextureD3D_3D::getLayerCount(int level) const { - mUsage = usage; + ASSERT(level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS); + return 1; } GLsizei TextureD3D_3D::getWidth(GLint level) const @@ -1505,8 +1547,9 @@ bool TextureD3D_3D::isDepth(GLint level) const return gl::GetInternalFormatInfo(getInternalFormat(level)).depthBits > 0; } -void TextureD3D_3D::setImage(GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) +void TextureD3D_3D::setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) { + ASSERT(target == GL_TEXTURE_3D); GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, type); redefineImage(level, sizedInternalFormat, width, height, depth); @@ -1535,16 +1578,20 @@ void TextureD3D_3D::setImage(GLint level, GLsizei width, GLsizei height, GLsizei } } -void TextureD3D_3D::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels) +void TextureD3D_3D::setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels) { + ASSERT(target == GL_TEXTURE_3D); + // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly redefineImage(level, format, width, height, depth); TextureD3D::setCompressedImage(imageSize, pixels, mImageArray[level]); } -void TextureD3D_3D::subImage(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) +void TextureD3D_3D::subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) { + ASSERT(target == GL_TEXTURE_3D); + bool fastUnpacked = false; // Attempt a fast gpu copy of the pixel data to the surface if the app bound an unpack buffer @@ -1568,16 +1615,25 @@ void TextureD3D_3D::subImage(GLint level, GLint xoffset, GLint yoffset, GLint zo } } -void TextureD3D_3D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels) +void TextureD3D_3D::subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels) { + ASSERT(target == GL_TEXTURE_3D); + if (TextureD3D::subImageCompressed(xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pixels, mImageArray[level])) { commitRect(level, xoffset, yoffset, zoffset, width, height, depth); } } +void TextureD3D_3D::copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source) +{ + UNIMPLEMENTED(); +} + void TextureD3D_3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source) { + ASSERT(target == GL_TEXTURE_3D); + // can only make our texture storage to a render target if level 0 is defined (with a width & height) and // the current level we're copying to is defined (with appropriate format, width & height) bool canCreateRenderTarget = isLevelComplete(level) && isLevelComplete(0); @@ -1608,8 +1664,10 @@ void TextureD3D_3D::copySubImage(GLenum target, GLint level, GLint xoffset, GLin } } -void TextureD3D_3D::storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) +void TextureD3D_3D::storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { + ASSERT(target == GL_TEXTURE_3D); + for (int level = 0; level < levels; level++) { GLsizei levelWidth = std::max(1, width >> level); @@ -2018,11 +2076,6 @@ GLsizei TextureD3D_2DArray::getLayerCount(int level) const return mLayerCounts[level]; } -void TextureD3D_2DArray::setUsage(GLenum usage) -{ - mUsage = usage; -} - GLsizei TextureD3D_2DArray::getWidth(GLint level) const { return (level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS && mLayerCounts[level] > 0) ? mImageArray[level][0]->getWidth() : 0; @@ -2048,8 +2101,10 @@ bool TextureD3D_2DArray::isDepth(GLint level) const return gl::GetInternalFormatInfo(getInternalFormat(level)).depthBits > 0; } -void TextureD3D_2DArray::setImage(GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) +void TextureD3D_2DArray::setImage(GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum internalFormat, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) { + ASSERT(target == GL_TEXTURE_2D_ARRAY); + GLenum sizedInternalFormat = gl::GetSizedInternalFormat(internalFormat, type); redefineImage(level, sizedInternalFormat, width, height, depth); @@ -2064,8 +2119,10 @@ void TextureD3D_2DArray::setImage(GLint level, GLsizei width, GLsizei height, GL } } -void TextureD3D_2DArray::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels) +void TextureD3D_2DArray::setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels) { + ASSERT(target == GL_TEXTURE_2D_ARRAY); + // compressed formats don't have separate sized internal formats-- we can just use the compressed format directly redefineImage(level, format, width, height, depth); @@ -2079,8 +2136,10 @@ void TextureD3D_2DArray::setCompressedImage(GLint level, GLenum format, GLsizei } } -void TextureD3D_2DArray::subImage(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) +void TextureD3D_2DArray::subImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const gl::PixelUnpackState &unpack, const void *pixels) { + ASSERT(target == GL_TEXTURE_2D_ARRAY); + const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(getInternalFormat(level)); GLsizei inputDepthPitch = formatInfo.computeDepthPitch(type, width, height, unpack.alignment); @@ -2096,8 +2155,10 @@ void TextureD3D_2DArray::subImage(GLint level, GLint xoffset, GLint yoffset, GLi } } -void TextureD3D_2DArray::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels) +void TextureD3D_2DArray::subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels) { + ASSERT(target == GL_TEXTURE_2D_ARRAY); + const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(format); GLsizei inputDepthPitch = formatInfo.computeDepthPitch(GL_UNSIGNED_BYTE, width, height, 1); @@ -2113,8 +2174,15 @@ void TextureD3D_2DArray::subImageCompressed(GLint level, GLint xoffset, GLint yo } } +void TextureD3D_2DArray::copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source) +{ + UNIMPLEMENTED(); +} + void TextureD3D_2DArray::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source) { + ASSERT(target == GL_TEXTURE_2D_ARRAY); + // can only make our texture storage to a render target if level 0 is defined (with a width & height) and // the current level we're copying to is defined (with appropriate format, width & height) bool canCreateRenderTarget = isLevelComplete(level) && isLevelComplete(0); @@ -2144,8 +2212,10 @@ void TextureD3D_2DArray::copySubImage(GLenum target, GLint level, GLint xoffset, } } -void TextureD3D_2DArray::storage(GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) +void TextureD3D_2DArray::storage(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { + ASSERT(target == GL_TEXTURE_2D_ARRAY); + deleteImages(); for (int level = 0; level < gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++) |