Commit 7ada9ec7 by Nicolas Capens Committed by Nicolas Capens

Refactor pixel storage modes.

Change-Id: Ida0a270c1e0ab0900109b7d3bce90dfee9a01960 Reviewed-on: https://swiftshader-review.googlesource.com/17091Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent a8d19187
...@@ -1013,10 +1013,10 @@ namespace egl ...@@ -1013,10 +1013,10 @@ namespace egl
return (rawPitch + alignment - 1) & ~(alignment - 1); return (rawPitch + alignment - 1) & ~(alignment - 1);
} }
size_t ComputePackingOffset(GLenum format, GLenum type, GLsizei width, GLsizei height, GLint alignment, GLint skipImages, GLint skipRows, GLint skipPixels) size_t ComputePackingOffset(GLenum format, GLenum type, GLsizei width, GLsizei height, const PixelStorageModes &storageModes)
{ {
GLsizei pitchB = ComputePitch(width, format, type, alignment); GLsizei pitchB = ComputePitch(width, format, type, storageModes.alignment);
return (skipImages * height + skipRows) * pitchB + skipPixels * ComputePixelSize(format, type); return (storageModes.skipImages * height + storageModes.skipRows) * pitchB + storageModes.skipPixels * ComputePixelSize(format, type);
} }
inline GLsizei ComputeCompressedPitch(GLsizei width, GLenum format) inline GLsizei ComputeCompressedPitch(GLsizei width, GLenum format)
...@@ -1200,7 +1200,7 @@ namespace egl ...@@ -1200,7 +1200,7 @@ namespace egl
return parentTexture == parent; return parentTexture == parent;
} }
void Image::loadImageData(Context *context, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const UnpackInfo& unpackInfo, const void *input) void Image::loadImageData(Context *context, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const PixelStorageModes &unpackParameters, const void *pixels)
{ {
sw::Format uploadFormat = SelectInternalFormat(format, type); sw::Format uploadFormat = SelectInternalFormat(format, type);
if(uploadFormat == sw::FORMAT_NULL) if(uploadFormat == sw::FORMAT_NULL)
...@@ -1208,10 +1208,10 @@ namespace egl ...@@ -1208,10 +1208,10 @@ namespace egl
return; return;
} }
GLsizei inputWidth = (unpackInfo.rowLength == 0) ? width : unpackInfo.rowLength; GLsizei inputWidth = (unpackParameters.rowLength == 0) ? width : unpackParameters.rowLength;
GLsizei inputPitch = ComputePitch(inputWidth, format, type, unpackInfo.alignment); GLsizei inputPitch = ComputePitch(inputWidth, format, type, unpackParameters.alignment);
GLsizei inputHeight = (unpackInfo.imageHeight == 0) ? height : unpackInfo.imageHeight; GLsizei inputHeight = (unpackParameters.imageHeight == 0) ? height : unpackParameters.imageHeight;
input = ((char*)input) + ComputePackingOffset(format, type, inputWidth, inputHeight, unpackInfo.alignment, unpackInfo.skipImages, unpackInfo.skipRows, unpackInfo.skipPixels); char *input = ((char*)pixels) + ComputePackingOffset(format, type, inputWidth, inputHeight, unpackParameters);
if(uploadFormat == internalFormat || if(uploadFormat == internalFormat ||
(uploadFormat == sw::FORMAT_A8B8G8R8 && internalFormat == sw::FORMAT_SRGB8_A8) || (uploadFormat == sw::FORMAT_A8B8G8R8 && internalFormat == sw::FORMAT_SRGB8_A8) ||
...@@ -1423,7 +1423,7 @@ namespace egl ...@@ -1423,7 +1423,7 @@ namespace egl
} }
else else
{ {
sw::Surface *source = sw::Surface::create(width, height, depth, ConvertFormatType(format, type), const_cast<void*>(input), inputPitch, inputPitch * inputHeight); sw::Surface *source = sw::Surface::create(width, height, depth, ConvertFormatType(format, type), input, inputPitch, inputPitch * inputHeight);
sw::Rect sourceRect(0, 0, width, height); sw::Rect sourceRect(0, 0, width, height);
sw::Rect destRect(xoffset, yoffset, xoffset + width, yoffset + height); sw::Rect destRect(xoffset, yoffset, xoffset + width, yoffset + height);
context->blit(source, sourceRect, this, destRect); context->blit(source, sourceRect, this, destRect);
......
...@@ -41,11 +41,21 @@ namespace egl ...@@ -41,11 +41,21 @@ namespace egl
class Context; class Context;
struct PixelStorageModes
{
GLint rowLength = 0;
GLint skipRows = 0;
GLint skipPixels = 0;
GLint alignment = 4;
GLint imageHeight = 0;
GLint skipImages = 0;
};
sw::Format ConvertFormatType(GLenum format, GLenum type); sw::Format ConvertFormatType(GLenum format, GLenum type);
sw::Format SelectInternalFormat(GLenum format, GLenum type); sw::Format SelectInternalFormat(GLenum format, GLenum type);
GLsizei ComputePitch(GLsizei width, GLenum format, GLenum type, GLint alignment); GLsizei ComputePitch(GLsizei width, GLenum format, GLenum type, GLint alignment);
GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format); GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format);
size_t ComputePackingOffset(GLenum format, GLenum type, GLsizei width, GLsizei height, GLint alignment, GLint skipImages, GLint skipRows, GLint skipPixels); size_t ComputePackingOffset(GLenum format, GLenum type, GLsizei width, GLsizei height, const PixelStorageModes &storageModes);
class [[clang::lto_visibility_public]] Image : public sw::Surface, public gl::Object class [[clang::lto_visibility_public]] Image : public sw::Surface, public gl::Object
{ {
...@@ -170,19 +180,7 @@ public: ...@@ -170,19 +180,7 @@ public:
void *lockInternal(int x, int y, int z, sw::Lock lock, sw::Accessor client) override = 0; void *lockInternal(int x, int y, int z, sw::Lock lock, sw::Accessor client) override = 0;
void unlockInternal() override = 0; void unlockInternal() override = 0;
struct UnpackInfo void loadImageData(Context *context, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const PixelStorageModes &unpackParameters, const void *pixels);
{
UnpackInfo() : alignment(4), rowLength(0), imageHeight(0), skipPixels(0), skipRows(0), skipImages(0) {}
GLint alignment;
GLint rowLength;
GLint imageHeight;
GLint skipPixels;
GLint skipRows;
GLint skipImages;
};
void loadImageData(Context *context, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const UnpackInfo& unpackInfo, const void *input);
void loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels); void loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels);
void release() override = 0; void release() override = 0;
......
...@@ -231,9 +231,9 @@ void Texture::setImage(egl::Context *context, GLenum format, GLenum type, GLint ...@@ -231,9 +231,9 @@ void Texture::setImage(egl::Context *context, GLenum format, GLenum type, GLint
{ {
if(pixels && image) if(pixels && image)
{ {
egl::Image::UnpackInfo unpackInfo; egl::Image::PixelStorageModes unpackParameters;
unpackInfo.alignment = unpackAlignment; unpackParameters.alignment = unpackAlignment;
image->loadImageData(context, 0, 0, 0, image->getWidth(), image->getHeight(), 1, format, type, unpackInfo, pixels); image->loadImageData(context, 0, 0, 0, image->getWidth(), image->getHeight(), 1, format, type, unpackParameters, pixels);
} }
} }
...@@ -269,9 +269,9 @@ void Texture::subImage(egl::Context *context, GLint xoffset, GLint yoffset, GLsi ...@@ -269,9 +269,9 @@ void Texture::subImage(egl::Context *context, GLint xoffset, GLint yoffset, GLsi
if(pixels) if(pixels)
{ {
egl::Image::UnpackInfo unpackInfo; egl::Image::PixelStorageModes unpackParameters;
unpackInfo.alignment = unpackAlignment; unpackParameters.alignment = unpackAlignment;
image->loadImageData(context, xoffset, yoffset, 0, width, height, 1, format, type, unpackInfo, pixels); image->loadImageData(context, xoffset, yoffset, 0, width, height, 1, format, type, unpackParameters, pixels);
} }
} }
......
...@@ -159,19 +159,6 @@ Context::Context(egl::Display *display, const Context *shareContext, EGLint clie ...@@ -159,19 +159,6 @@ Context::Context(egl::Display *display, const Context *shareContext, EGLint clie
mState.currentProgram = 0; mState.currentProgram = 0;
mState.packAlignment = 4;
mState.unpackInfo.alignment = 4;
mState.packRowLength = 0;
mState.packImageHeight = 0;
mState.packSkipPixels = 0;
mState.packSkipRows = 0;
mState.packSkipImages = 0;
mState.unpackInfo.rowLength = 0;
mState.unpackInfo.imageHeight = 0;
mState.unpackInfo.skipPixels = 0;
mState.unpackInfo.skipRows = 0;
mState.unpackInfo.skipImages = 0;
mVertexDataManager = nullptr; mVertexDataManager = nullptr;
mIndexDataManager = nullptr; mIndexDataManager = nullptr;
...@@ -847,67 +834,57 @@ const VertexAttributeArray &Context::getCurrentVertexAttributes() ...@@ -847,67 +834,57 @@ const VertexAttributeArray &Context::getCurrentVertexAttributes()
void Context::setPackAlignment(GLint alignment) void Context::setPackAlignment(GLint alignment)
{ {
mState.packAlignment = alignment; mState.packParameters.alignment = alignment;
} }
void Context::setUnpackAlignment(GLint alignment) void Context::setUnpackAlignment(GLint alignment)
{ {
mState.unpackInfo.alignment = alignment; mState.unpackParameters.alignment = alignment;
} }
const egl::Image::UnpackInfo& Context::getUnpackInfo() const const egl::PixelStorageModes &Context::getUnpackParameters() const
{ {
return mState.unpackInfo; return mState.unpackParameters;
} }
void Context::setPackRowLength(GLint rowLength) void Context::setPackRowLength(GLint rowLength)
{ {
mState.packRowLength = rowLength; mState.packParameters.rowLength = rowLength;
}
void Context::setPackImageHeight(GLint imageHeight)
{
mState.packImageHeight = imageHeight;
} }
void Context::setPackSkipPixels(GLint skipPixels) void Context::setPackSkipPixels(GLint skipPixels)
{ {
mState.packSkipPixels = skipPixels; mState.packParameters.skipPixels = skipPixels;
} }
void Context::setPackSkipRows(GLint skipRows) void Context::setPackSkipRows(GLint skipRows)
{ {
mState.packSkipRows = skipRows; mState.packParameters.skipRows = skipRows;
}
void Context::setPackSkipImages(GLint skipImages)
{
mState.packSkipImages = skipImages;
} }
void Context::setUnpackRowLength(GLint rowLength) void Context::setUnpackRowLength(GLint rowLength)
{ {
mState.unpackInfo.rowLength = rowLength; mState.unpackParameters.rowLength = rowLength;
} }
void Context::setUnpackImageHeight(GLint imageHeight) void Context::setUnpackImageHeight(GLint imageHeight)
{ {
mState.unpackInfo.imageHeight = imageHeight; mState.unpackParameters.imageHeight = imageHeight;
} }
void Context::setUnpackSkipPixels(GLint skipPixels) void Context::setUnpackSkipPixels(GLint skipPixels)
{ {
mState.unpackInfo.skipPixels = skipPixels; mState.unpackParameters.skipPixels = skipPixels;
} }
void Context::setUnpackSkipRows(GLint skipRows) void Context::setUnpackSkipRows(GLint skipRows)
{ {
mState.unpackInfo.skipRows = skipRows; mState.unpackParameters.skipRows = skipRows;
} }
void Context::setUnpackSkipImages(GLint skipImages) void Context::setUnpackSkipImages(GLint skipImages)
{ {
mState.unpackInfo.skipImages = skipImages; mState.unpackParameters.skipImages = skipImages;
} }
GLuint Context::createBuffer() GLuint Context::createBuffer()
...@@ -1590,9 +1567,9 @@ Buffer *Context::getGenericUniformBuffer() const ...@@ -1590,9 +1567,9 @@ Buffer *Context::getGenericUniformBuffer() const
GLsizei Context::getRequiredBufferSize(GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type) const GLsizei Context::getRequiredBufferSize(GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type) const
{ {
GLsizei inputWidth = (mState.unpackInfo.rowLength == 0) ? width : mState.unpackInfo.rowLength; GLsizei inputWidth = (mState.unpackParameters.rowLength == 0) ? width : mState.unpackParameters.rowLength;
GLsizei inputPitch = egl::ComputePitch(inputWidth, format, type, mState.unpackInfo.alignment); GLsizei inputPitch = egl::ComputePitch(inputWidth, format, type, mState.unpackParameters.alignment);
GLsizei inputHeight = (mState.unpackInfo.imageHeight == 0) ? height : mState.unpackInfo.imageHeight; GLsizei inputHeight = (mState.unpackParameters.imageHeight == 0) ? height : mState.unpackParameters.imageHeight;
return inputPitch * inputHeight * depth; return inputPitch * inputHeight * depth;
} }
...@@ -1963,8 +1940,8 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -1963,8 +1940,8 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
case GL_READ_FRAMEBUFFER_BINDING: *params = mState.readFramebuffer; return true; case GL_READ_FRAMEBUFFER_BINDING: *params = mState.readFramebuffer; return true;
case GL_RENDERBUFFER_BINDING: *params = mState.renderbuffer.name(); return true; case GL_RENDERBUFFER_BINDING: *params = mState.renderbuffer.name(); return true;
case GL_CURRENT_PROGRAM: *params = mState.currentProgram; return true; case GL_CURRENT_PROGRAM: *params = mState.currentProgram; return true;
case GL_PACK_ALIGNMENT: *params = mState.packAlignment; return true; case GL_PACK_ALIGNMENT: *params = mState.packParameters.alignment; return true;
case GL_UNPACK_ALIGNMENT: *params = mState.unpackInfo.alignment; return true; case GL_UNPACK_ALIGNMENT: *params = mState.unpackParameters.alignment; return true;
case GL_GENERATE_MIPMAP_HINT: *params = mState.generateMipmapHint; return true; case GL_GENERATE_MIPMAP_HINT: *params = mState.generateMipmapHint; return true;
case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mState.fragmentShaderDerivativeHint; return true; case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mState.fragmentShaderDerivativeHint; return true;
case GL_TEXTURE_FILTERING_HINT_CHROMIUM: *params = mState.textureFilteringHint; return true; case GL_TEXTURE_FILTERING_HINT_CHROMIUM: *params = mState.textureFilteringHint; return true;
...@@ -2321,13 +2298,13 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -2321,13 +2298,13 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
*params = NUM_PROGRAM_BINARY_FORMATS; *params = NUM_PROGRAM_BINARY_FORMATS;
return true; return true;
case GL_PACK_ROW_LENGTH: case GL_PACK_ROW_LENGTH:
*params = mState.packRowLength; *params = mState.packParameters.rowLength;
return true; return true;
case GL_PACK_SKIP_PIXELS: case GL_PACK_SKIP_PIXELS:
*params = mState.packSkipPixels; *params = mState.packParameters.skipPixels;
return true; return true;
case GL_PACK_SKIP_ROWS: case GL_PACK_SKIP_ROWS:
*params = mState.packSkipRows; *params = mState.packParameters.skipRows;
return true; return true;
case GL_PIXEL_PACK_BUFFER_BINDING: case GL_PIXEL_PACK_BUFFER_BINDING:
*params = mState.pixelPackBuffer.name(); *params = mState.pixelPackBuffer.name();
...@@ -2358,19 +2335,19 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -2358,19 +2335,19 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
*params = static_cast<T>(mState.genericUniformBuffer->offset()); *params = static_cast<T>(mState.genericUniformBuffer->offset());
return true; return true;
case GL_UNPACK_IMAGE_HEIGHT: case GL_UNPACK_IMAGE_HEIGHT:
*params = mState.unpackInfo.imageHeight; *params = mState.unpackParameters.imageHeight;
return true; return true;
case GL_UNPACK_ROW_LENGTH: case GL_UNPACK_ROW_LENGTH:
*params = mState.unpackInfo.rowLength; *params = mState.unpackParameters.rowLength;
return true; return true;
case GL_UNPACK_SKIP_IMAGES: case GL_UNPACK_SKIP_IMAGES:
*params = mState.unpackInfo.skipImages; *params = mState.unpackParameters.skipImages;
return true; return true;
case GL_UNPACK_SKIP_PIXELS: case GL_UNPACK_SKIP_PIXELS:
*params = mState.unpackInfo.skipPixels; *params = mState.unpackParameters.skipPixels;
return true; return true;
case GL_UNPACK_SKIP_ROWS: case GL_UNPACK_SKIP_ROWS:
*params = mState.unpackInfo.skipRows; *params = mState.unpackParameters.skipRows;
return true; return true;
case GL_VERTEX_ARRAY_BINDING: case GL_VERTEX_ARRAY_BINDING:
*params = getCurrentVertexArray()->name; *params = getCurrentVertexArray()->name;
...@@ -3337,11 +3314,11 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum ...@@ -3337,11 +3314,11 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
GLsizei outputWidth = (mState.packRowLength > 0) ? mState.packRowLength : width; GLsizei outputWidth = (mState.packParameters.rowLength > 0) ? mState.packParameters.rowLength : width;
GLsizei outputPitch = egl::ComputePitch(outputWidth, format, type, mState.packAlignment); GLsizei outputPitch = egl::ComputePitch(outputWidth, format, type, mState.packParameters.alignment);
GLsizei outputHeight = (mState.packImageHeight == 0) ? height : mState.packImageHeight; GLsizei outputHeight = (mState.packParameters.imageHeight == 0) ? height : mState.packParameters.imageHeight;
pixels = getPixelPackBuffer() ? (unsigned char*)getPixelPackBuffer()->data() + (ptrdiff_t)pixels : (unsigned char*)pixels; pixels = getPixelPackBuffer() ? (unsigned char*)getPixelPackBuffer()->data() + (ptrdiff_t)pixels : (unsigned char*)pixels;
pixels = ((char*)pixels) + egl::ComputePackingOffset(format, type, outputWidth, outputHeight, mState.packAlignment, mState.packSkipImages, mState.packSkipRows, mState.packSkipPixels); pixels = ((char*)pixels) + egl::ComputePackingOffset(format, type, outputWidth, outputHeight, mState.packParameters);
// Sized query sanity check // Sized query sanity check
if(bufSize) if(bufSize)
......
...@@ -422,13 +422,8 @@ struct State ...@@ -422,13 +422,8 @@ struct State
gl::BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][MAX_COMBINED_TEXTURE_IMAGE_UNITS]; gl::BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][MAX_COMBINED_TEXTURE_IMAGE_UNITS];
gl::BindingPointer<Query> activeQuery[QUERY_TYPE_COUNT]; gl::BindingPointer<Query> activeQuery[QUERY_TYPE_COUNT];
egl::Image::UnpackInfo unpackInfo; egl::PixelStorageModes unpackParameters;
GLint packAlignment; egl::PixelStorageModes packParameters;
GLint packRowLength;
GLint packImageHeight;
GLint packSkipPixels;
GLint packSkipRows;
GLint packSkipImages;
}; };
class [[clang::lto_visibility_public]] Context : public egl::Context class [[clang::lto_visibility_public]] Context : public egl::Context
...@@ -538,14 +533,12 @@ public: ...@@ -538,14 +533,12 @@ public:
void setUnpackSkipPixels(GLint skipPixels); void setUnpackSkipPixels(GLint skipPixels);
void setUnpackSkipRows(GLint skipRows); void setUnpackSkipRows(GLint skipRows);
void setUnpackSkipImages(GLint skipImages); void setUnpackSkipImages(GLint skipImages);
const egl::Image::UnpackInfo& getUnpackInfo() const; const egl::PixelStorageModes &getUnpackParameters() const;
void setPackAlignment(GLint alignment); void setPackAlignment(GLint alignment);
void setPackRowLength(GLint rowLength); void setPackRowLength(GLint rowLength);
void setPackImageHeight(GLint imageHeight);
void setPackSkipPixels(GLint skipPixels); void setPackSkipPixels(GLint skipPixels);
void setPackSkipRows(GLint skipRows); void setPackSkipRows(GLint skipRows);
void setPackSkipImages(GLint skipImages);
// These create and destroy methods are merely pass-throughs to // These create and destroy methods are merely pass-throughs to
// ResourceManager, which owns these object types // ResourceManager, which owns these object types
......
...@@ -333,12 +333,12 @@ egl::Image *Texture::createSharedImage(GLenum target, unsigned int level) ...@@ -333,12 +333,12 @@ egl::Image *Texture::createSharedImage(GLenum target, unsigned int level)
return image; return image;
} }
void Texture::setImage(egl::Context *context, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels, egl::Image *image) void Texture::setImage(egl::Context *context, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels, egl::Image *image)
{ {
if(pixels && image) if(pixels && image)
{ {
GLsizei depth = (getTarget() == GL_TEXTURE_3D_OES || getTarget() == GL_TEXTURE_2D_ARRAY) ? image->getDepth() : 1; GLsizei depth = (getTarget() == GL_TEXTURE_3D_OES || getTarget() == GL_TEXTURE_2D_ARRAY) ? image->getDepth() : 1;
image->loadImageData(context, 0, 0, 0, image->getWidth(), image->getHeight(), depth, format, type, unpackInfo, pixels); image->loadImageData(context, 0, 0, 0, image->getWidth(), image->getHeight(), depth, format, type, unpackParameters, pixels);
} }
} }
...@@ -351,7 +351,7 @@ void Texture::setCompressedImage(GLsizei imageSize, const void *pixels, egl::Ima ...@@ -351,7 +351,7 @@ void Texture::setCompressedImage(GLsizei imageSize, const void *pixels, egl::Ima
} }
} }
void Texture::subImage(egl::Context *context, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels, egl::Image *image) void Texture::subImage(egl::Context *context, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels, egl::Image *image)
{ {
if(!image) if(!image)
{ {
...@@ -360,7 +360,7 @@ void Texture::subImage(egl::Context *context, GLint xoffset, GLint yoffset, GLin ...@@ -360,7 +360,7 @@ void Texture::subImage(egl::Context *context, GLint xoffset, GLint yoffset, GLin
if(pixels && width > 0 && height > 0 && depth > 0) if(pixels && width > 0 && height > 0 && depth > 0)
{ {
image->loadImageData(context, xoffset, yoffset, zoffset, width, height, depth, format, type, unpackInfo, pixels); image->loadImageData(context, xoffset, yoffset, zoffset, width, height, depth, format, type, unpackParameters, pixels);
} }
} }
...@@ -534,7 +534,7 @@ int Texture2D::getTopLevel() const ...@@ -534,7 +534,7 @@ int Texture2D::getTopLevel() const
return level - 1; return level - 1;
} }
void Texture2D::setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLint internalformat, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels) void Texture2D::setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLint internalformat, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels)
{ {
if(image[level]) if(image[level])
{ {
...@@ -548,7 +548,7 @@ void Texture2D::setImage(egl::Context *context, GLint level, GLsizei width, GLsi ...@@ -548,7 +548,7 @@ void Texture2D::setImage(egl::Context *context, GLint level, GLsizei width, GLsi
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
} }
Texture::setImage(context, format, type, unpackInfo, pixels, image[level]); Texture::setImage(context, format, type, unpackParameters, pixels, image[level]);
} }
void Texture2D::bindTexImage(gl::Surface *surface) void Texture2D::bindTexImage(gl::Surface *surface)
...@@ -610,9 +610,9 @@ void Texture2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GL ...@@ -610,9 +610,9 @@ void Texture2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GL
Texture::setCompressedImage(imageSize, pixels, image[level]); Texture::setCompressedImage(imageSize, pixels, image[level]);
} }
void Texture2D::subImage(egl::Context *context, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels) void Texture2D::subImage(egl::Context *context, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels)
{ {
Texture::subImage(context, xoffset, yoffset, 0, width, height, 1, format, type, unpackInfo, pixels, image[level]); Texture::subImage(context, xoffset, yoffset, 0, width, height, 1, format, type, unpackParameters, pixels, image[level]);
} }
void Texture2D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels) void Texture2D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels)
...@@ -1037,9 +1037,9 @@ void TextureCubeMap::setCompressedImage(GLenum target, GLint level, GLenum forma ...@@ -1037,9 +1037,9 @@ void TextureCubeMap::setCompressedImage(GLenum target, GLint level, GLenum forma
Texture::setCompressedImage(imageSize, pixels, image[face][level]); Texture::setCompressedImage(imageSize, pixels, image[face][level]);
} }
void TextureCubeMap::subImage(egl::Context *context, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels) void TextureCubeMap::subImage(egl::Context *context, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels)
{ {
Texture::subImage(context, xoffset, yoffset, 0, width, height, 1, format, type, unpackInfo, pixels, image[CubeFaceIndex(target)][level]); Texture::subImage(context, xoffset, yoffset, 0, width, height, 1, format, type, unpackParameters, pixels, image[CubeFaceIndex(target)][level]);
} }
void TextureCubeMap::subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels) void TextureCubeMap::subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels)
...@@ -1230,7 +1230,7 @@ void TextureCubeMap::releaseTexImage() ...@@ -1230,7 +1230,7 @@ void TextureCubeMap::releaseTexImage()
UNREACHABLE(0); // Cube maps cannot have an EGL surface bound as an image UNREACHABLE(0); // Cube maps cannot have an EGL surface bound as an image
} }
void TextureCubeMap::setImage(egl::Context *context, GLenum target, GLint level, GLsizei width, GLsizei height, GLint internalformat, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels) void TextureCubeMap::setImage(egl::Context *context, GLenum target, GLint level, GLsizei width, GLsizei height, GLint internalformat, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels)
{ {
int face = CubeFaceIndex(target); int face = CubeFaceIndex(target);
...@@ -1247,7 +1247,7 @@ void TextureCubeMap::setImage(egl::Context *context, GLenum target, GLint level, ...@@ -1247,7 +1247,7 @@ void TextureCubeMap::setImage(egl::Context *context, GLenum target, GLint level,
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
} }
Texture::setImage(context, format, type, unpackInfo, pixels, image[face][level]); Texture::setImage(context, format, type, unpackParameters, pixels, image[face][level]);
} }
void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source)
...@@ -1539,7 +1539,7 @@ int Texture3D::getTopLevel() const ...@@ -1539,7 +1539,7 @@ int Texture3D::getTopLevel() const
return level - 1; return level - 1;
} }
void Texture3D::setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLint internalformat, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels) void Texture3D::setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLint internalformat, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels)
{ {
if(image[level]) if(image[level])
{ {
...@@ -1553,7 +1553,7 @@ void Texture3D::setImage(egl::Context *context, GLint level, GLsizei width, GLsi ...@@ -1553,7 +1553,7 @@ void Texture3D::setImage(egl::Context *context, GLint level, GLsizei width, GLsi
return error(GL_OUT_OF_MEMORY); return error(GL_OUT_OF_MEMORY);
} }
Texture::setImage(context, format, type, unpackInfo, pixels, image[level]); Texture::setImage(context, format, type, unpackParameters, pixels, image[level]);
} }
void Texture3D::releaseTexImage() void Texture3D::releaseTexImage()
...@@ -1579,9 +1579,9 @@ void Texture3D::setCompressedImage(GLint level, GLenum format, GLsizei width, GL ...@@ -1579,9 +1579,9 @@ void Texture3D::setCompressedImage(GLint level, GLenum format, GLsizei width, GL
Texture::setCompressedImage(imageSize, pixels, image[level]); Texture::setCompressedImage(imageSize, pixels, image[level]);
} }
void Texture3D::subImage(egl::Context *context, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels) void Texture3D::subImage(egl::Context *context, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels)
{ {
Texture::subImage(context, xoffset, yoffset, zoffset, width, height, depth, format, type, unpackInfo, pixels, image[level]); Texture::subImage(context, xoffset, yoffset, zoffset, width, height, depth, format, type, unpackParameters, pixels, image[level]);
} }
void Texture3D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels) void Texture3D::subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels)
......
...@@ -112,8 +112,8 @@ public: ...@@ -112,8 +112,8 @@ public:
protected: protected:
~Texture() override; ~Texture() override;
void setImage(egl::Context *context, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels, egl::Image *image); void setImage(egl::Context *context, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels, egl::Image *image);
void subImage(egl::Context *context, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels, egl::Image *image); void subImage(egl::Context *context, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels, egl::Image *image);
void setCompressedImage(GLsizei imageSize, const void *pixels, egl::Image *image); void setCompressedImage(GLsizei imageSize, const void *pixels, egl::Image *image);
void subImageCompressed(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels, egl::Image *image); void subImageCompressed(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels, egl::Image *image);
...@@ -160,9 +160,9 @@ public: ...@@ -160,9 +160,9 @@ public:
GLenum getType(GLenum target, GLint level) const override; GLenum getType(GLenum target, GLint level) const override;
int getTopLevel() const override; int getTopLevel() const override;
void setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLint internalformat, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); void setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLint internalformat, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels);
void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
void subImage(egl::Context *context, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); void subImage(egl::Context *context, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels);
void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source); void copyImage(GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source);
void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) override; void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) override;
...@@ -226,10 +226,10 @@ public: ...@@ -226,10 +226,10 @@ public:
GLenum getType(GLenum target, GLint level) const override; GLenum getType(GLenum target, GLint level) const override;
int getTopLevel() const override; int getTopLevel() const override;
void setImage(egl::Context *context, GLenum target, GLint level, GLsizei width, GLsizei height, GLint internalformat, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); void setImage(egl::Context *context, GLenum target, GLint level, GLsizei width, GLsizei height, GLint internalformat, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels);
void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels); void setCompressedImage(GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels);
void subImage(egl::Context *context, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); void subImage(egl::Context *context, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels);
void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels); void subImageCompressed(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels);
void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source); void copyImage(GLenum target, GLint level, GLenum format, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source);
void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) override; void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source) override;
...@@ -288,9 +288,9 @@ public: ...@@ -288,9 +288,9 @@ public:
GLenum getType(GLenum target, GLint level) const override; GLenum getType(GLenum target, GLint level) const override;
int getTopLevel() const override; int getTopLevel() const override;
void setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLint internalformat, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); void setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLint internalformat, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels);
void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels); void setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels);
void subImage(egl::Context *context, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels); void subImage(egl::Context *context, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::PixelStorageModes &unpackParameters, const void *pixels);
void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels); void subImageCompressed(GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels);
void copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z, GLsizei width, GLsizei height, GLsizei depth, Renderbuffer *source); void copyImage(GLint level, GLenum format, GLint x, GLint y, GLint z, GLsizei width, GLsizei height, GLsizei depth, Renderbuffer *source);
void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source); void copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, Renderbuffer *source);
......
...@@ -5021,7 +5021,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5021,7 +5021,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
texture->setImage(context, level, width, height, sizedInternalFormat, format, type, context->getUnpackInfo(), data); texture->setImage(context, level, width, height, sizedInternalFormat, format, type, context->getUnpackParameters(), data);
} }
else else
{ {
...@@ -5032,7 +5032,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5032,7 +5032,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
texture->setImage(context, target, level, width, height, sizedInternalFormat, format, type, context->getUnpackInfo(), data); texture->setImage(context, target, level, width, height, sizedInternalFormat, format, type, context->getUnpackParameters(), data);
} }
} }
} }
...@@ -5389,7 +5389,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -5389,7 +5389,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
return error(validationError); return error(validationError);
} }
texture->subImage(context, level, xoffset, yoffset, width, height, format, type, context->getUnpackInfo(), data); texture->subImage(context, level, xoffset, yoffset, width, height, format, type, context->getUnpackParameters(), data);
} }
else if(es2::IsCubemapTextureTarget(target)) else if(es2::IsCubemapTextureTarget(target))
{ {
...@@ -5407,7 +5407,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -5407,7 +5407,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
return error(validationError); return error(validationError);
} }
texture->subImage(context, target, level, xoffset, yoffset, width, height, format, type, context->getUnpackInfo(), data); texture->subImage(context, target, level, xoffset, yoffset, width, height, format, type, context->getUnpackParameters(), data);
} }
else UNREACHABLE(target); else UNREACHABLE(target);
} }
...@@ -6250,7 +6250,7 @@ void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei wi ...@@ -6250,7 +6250,7 @@ void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei wi
} }
GLenum sizedInternalFormat = GetSizedInternalFormat(internalformat, type); GLenum sizedInternalFormat = GetSizedInternalFormat(internalformat, type);
texture->setImage(context, level, width, height, depth, sizedInternalFormat, format, type, context->getUnpackInfo(), data); texture->setImage(context, level, width, height, depth, sizedInternalFormat, format, type, context->getUnpackParameters(), data);
} }
} }
...@@ -6302,7 +6302,7 @@ void TexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, ...@@ -6302,7 +6302,7 @@ void TexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset,
return error(validationError); return error(validationError);
} }
texture->subImage(context, level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackInfo(), data); texture->subImage(context, level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackParameters(), data);
} }
} }
......
...@@ -633,7 +633,7 @@ GL_APICALL void GL_APIENTRY glTexImage3D(GLenum target, GLint level, GLint inter ...@@ -633,7 +633,7 @@ GL_APICALL void GL_APIENTRY glTexImage3D(GLenum target, GLint level, GLint inter
} }
GLenum sizedInternalFormat = GetSizedInternalFormat(internalformat, type); GLenum sizedInternalFormat = GetSizedInternalFormat(internalformat, type);
texture->setImage(context, level, width, height, depth, sizedInternalFormat, format, type, context->getUnpackInfo(), data); texture->setImage(context, level, width, height, depth, sizedInternalFormat, format, type, context->getUnpackParameters(), data);
} }
} }
...@@ -686,7 +686,7 @@ GL_APICALL void GL_APIENTRY glTexSubImage3D(GLenum target, GLint level, GLint xo ...@@ -686,7 +686,7 @@ GL_APICALL void GL_APIENTRY glTexSubImage3D(GLenum target, GLint level, GLint xo
return error(validationError); return error(validationError);
} }
texture->subImage(context, level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackInfo(), data); texture->subImage(context, level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackParameters(), data);
} }
} }
...@@ -3869,41 +3869,41 @@ GL_APICALL void GL_APIENTRY glTexStorage2D(GLenum target, GLsizei levels, GLenum ...@@ -3869,41 +3869,41 @@ GL_APICALL void GL_APIENTRY glTexStorage2D(GLenum target, GLsizei levels, GLenum
{ {
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
case GL_TEXTURE_RECTANGLE_ARB: case GL_TEXTURE_RECTANGLE_ARB:
{
es2::Texture2D *texture = context->getTexture2D(target);
if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
{ {
return error(GL_INVALID_OPERATION); es2::Texture2D *texture = context->getTexture2D(target);
} if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
{
return error(GL_INVALID_OPERATION);
}
for(int level = 0; level < levels; level++) for(int level = 0; level < levels; level++)
{ {
texture->setImage(context, level, width, height, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr); texture->setImage(context, level, width, height, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackParameters(), nullptr);
width = std::max(1, (width / 2)); width = std::max(1, (width / 2));
height = std::max(1, (height / 2)); height = std::max(1, (height / 2));
}
texture->makeImmutable(levels);
} }
texture->makeImmutable(levels);
}
break; break;
case GL_TEXTURE_CUBE_MAP: case GL_TEXTURE_CUBE_MAP:
{
es2::TextureCubeMap *texture = context->getTextureCubeMap();
if(!texture || texture->name == 0 || texture->getImmutableFormat())
{ {
return error(GL_INVALID_OPERATION); es2::TextureCubeMap *texture = context->getTextureCubeMap();
} if(!texture || texture->name == 0 || texture->getImmutableFormat())
{
return error(GL_INVALID_OPERATION);
}
for(int level = 0; level < levels; level++) for(int level = 0; level < levels; level++)
{
for(int face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
{ {
texture->setImage(context, face, level, width, height, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr); for(int face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
{
texture->setImage(context, face, level, width, height, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackParameters(), nullptr);
}
width = std::max(1, (width / 2));
height = std::max(1, (height / 2));
} }
width = std::max(1, (width / 2)); texture->makeImmutable(levels);
height = std::max(1, (height / 2));
} }
texture->makeImmutable(levels);
}
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -3935,52 +3935,52 @@ GL_APICALL void GL_APIENTRY glTexStorage3D(GLenum target, GLsizei levels, GLenum ...@@ -3935,52 +3935,52 @@ GL_APICALL void GL_APIENTRY glTexStorage3D(GLenum target, GLsizei levels, GLenum
switch(target) switch(target)
{ {
case GL_TEXTURE_3D: case GL_TEXTURE_3D:
{
if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(std::max(width, height), depth)) + 1))
{ {
return error(GL_INVALID_OPERATION); if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(std::max(width, height), depth)) + 1))
} {
return error(GL_INVALID_OPERATION);
es2::Texture3D *texture = context->getTexture3D(); }
if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
{ es2::Texture3D *texture = context->getTexture3D();
return error(GL_INVALID_OPERATION); if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
} {
return error(GL_INVALID_OPERATION);
}
for(int level = 0; level < levels; level++) for(int level = 0; level < levels; level++)
{ {
texture->setImage(context, level, width, height, depth, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr); texture->setImage(context, level, width, height, depth, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackParameters(), nullptr);
width = std::max(1, (width / 2)); width = std::max(1, (width / 2));
height = std::max(1, (height / 2)); height = std::max(1, (height / 2));
depth = std::max(1, (depth / 2)); depth = std::max(1, (depth / 2));
}
texture->makeImmutable(levels);
} }
texture->makeImmutable(levels);
}
break; break;
case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_2D_ARRAY:
{
if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(width, height)) + 1))
{
return error(GL_INVALID_OPERATION);
}
es2::Texture3D *texture = context->getTexture2DArray();
if(!texture || texture->name == 0 || texture->getImmutableFormat())
{ {
return error(GL_INVALID_OPERATION); if(levels > es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || levels > (log2(std::max(width, height)) + 1))
} {
return error(GL_INVALID_OPERATION);
}
es2::Texture3D *texture = context->getTexture2DArray();
if(!texture || texture->name == 0 || texture->getImmutableFormat())
{
return error(GL_INVALID_OPERATION);
}
for(int level = 0; level < levels; level++) for(int level = 0; level < levels; level++)
{
for(int face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
{ {
texture->setImage(context, level, width, height, depth, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr); for(int face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; face++)
{
texture->setImage(context, level, width, height, depth, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackParameters(), nullptr);
}
width = std::max(1, (width / 2));
height = std::max(1, (height / 2));
} }
width = std::max(1, (width / 2)); texture->makeImmutable(levels);
height = std::max(1, (height / 2));
} }
texture->makeImmutable(levels);
}
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment