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
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);
return (skipImages * height + skipRows) * pitchB + skipPixels * ComputePixelSize(format, type);
GLsizei pitchB = ComputePitch(width, format, type, storageModes.alignment);
return (storageModes.skipImages * height + storageModes.skipRows) * pitchB + storageModes.skipPixels * ComputePixelSize(format, type);
}
inline GLsizei ComputeCompressedPitch(GLsizei width, GLenum format)
......@@ -1200,7 +1200,7 @@ namespace egl
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);
if(uploadFormat == sw::FORMAT_NULL)
......@@ -1208,10 +1208,10 @@ namespace egl
return;
}
GLsizei inputWidth = (unpackInfo.rowLength == 0) ? width : unpackInfo.rowLength;
GLsizei inputPitch = ComputePitch(inputWidth, format, type, unpackInfo.alignment);
GLsizei inputHeight = (unpackInfo.imageHeight == 0) ? height : unpackInfo.imageHeight;
input = ((char*)input) + ComputePackingOffset(format, type, inputWidth, inputHeight, unpackInfo.alignment, unpackInfo.skipImages, unpackInfo.skipRows, unpackInfo.skipPixels);
GLsizei inputWidth = (unpackParameters.rowLength == 0) ? width : unpackParameters.rowLength;
GLsizei inputPitch = ComputePitch(inputWidth, format, type, unpackParameters.alignment);
GLsizei inputHeight = (unpackParameters.imageHeight == 0) ? height : unpackParameters.imageHeight;
char *input = ((char*)pixels) + ComputePackingOffset(format, type, inputWidth, inputHeight, unpackParameters);
if(uploadFormat == internalFormat ||
(uploadFormat == sw::FORMAT_A8B8G8R8 && internalFormat == sw::FORMAT_SRGB8_A8) ||
......@@ -1423,7 +1423,7 @@ namespace egl
}
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 destRect(xoffset, yoffset, xoffset + width, yoffset + height);
context->blit(source, sourceRect, this, destRect);
......
......@@ -41,11 +41,21 @@ namespace egl
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 SelectInternalFormat(GLenum format, GLenum type);
GLsizei ComputePitch(GLsizei width, GLenum format, GLenum type, GLint alignment);
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
{
......@@ -170,19 +180,7 @@ public:
void *lockInternal(int x, int y, int z, sw::Lock lock, sw::Accessor client) override = 0;
void unlockInternal() override = 0;
struct UnpackInfo
{
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 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);
void loadCompressedData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei imageSize, const void *pixels);
void release() override = 0;
......
......@@ -231,9 +231,9 @@ void Texture::setImage(egl::Context *context, GLenum format, GLenum type, GLint
{
if(pixels && image)
{
egl::Image::UnpackInfo unpackInfo;
unpackInfo.alignment = unpackAlignment;
image->loadImageData(context, 0, 0, 0, image->getWidth(), image->getHeight(), 1, format, type, unpackInfo, pixels);
egl::Image::PixelStorageModes unpackParameters;
unpackParameters.alignment = unpackAlignment;
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
if(pixels)
{
egl::Image::UnpackInfo unpackInfo;
unpackInfo.alignment = unpackAlignment;
image->loadImageData(context, xoffset, yoffset, 0, width, height, 1, format, type, unpackInfo, pixels);
egl::Image::PixelStorageModes unpackParameters;
unpackParameters.alignment = unpackAlignment;
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
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;
mIndexDataManager = nullptr;
......@@ -847,67 +834,57 @@ const VertexAttributeArray &Context::getCurrentVertexAttributes()
void Context::setPackAlignment(GLint alignment)
{
mState.packAlignment = alignment;
mState.packParameters.alignment = 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)
{
mState.packRowLength = rowLength;
}
void Context::setPackImageHeight(GLint imageHeight)
{
mState.packImageHeight = imageHeight;
mState.packParameters.rowLength = rowLength;
}
void Context::setPackSkipPixels(GLint skipPixels)
{
mState.packSkipPixels = skipPixels;
mState.packParameters.skipPixels = skipPixels;
}
void Context::setPackSkipRows(GLint skipRows)
{
mState.packSkipRows = skipRows;
}
void Context::setPackSkipImages(GLint skipImages)
{
mState.packSkipImages = skipImages;
mState.packParameters.skipRows = skipRows;
}
void Context::setUnpackRowLength(GLint rowLength)
{
mState.unpackInfo.rowLength = rowLength;
mState.unpackParameters.rowLength = rowLength;
}
void Context::setUnpackImageHeight(GLint imageHeight)
{
mState.unpackInfo.imageHeight = imageHeight;
mState.unpackParameters.imageHeight = imageHeight;
}
void Context::setUnpackSkipPixels(GLint skipPixels)
{
mState.unpackInfo.skipPixels = skipPixels;
mState.unpackParameters.skipPixels = skipPixels;
}
void Context::setUnpackSkipRows(GLint skipRows)
{
mState.unpackInfo.skipRows = skipRows;
mState.unpackParameters.skipRows = skipRows;
}
void Context::setUnpackSkipImages(GLint skipImages)
{
mState.unpackInfo.skipImages = skipImages;
mState.unpackParameters.skipImages = skipImages;
}
GLuint Context::createBuffer()
......@@ -1590,9 +1567,9 @@ Buffer *Context::getGenericUniformBuffer() 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 inputPitch = egl::ComputePitch(inputWidth, format, type, mState.unpackInfo.alignment);
GLsizei inputHeight = (mState.unpackInfo.imageHeight == 0) ? height : mState.unpackInfo.imageHeight;
GLsizei inputWidth = (mState.unpackParameters.rowLength == 0) ? width : mState.unpackParameters.rowLength;
GLsizei inputPitch = egl::ComputePitch(inputWidth, format, type, mState.unpackParameters.alignment);
GLsizei inputHeight = (mState.unpackParameters.imageHeight == 0) ? height : mState.unpackParameters.imageHeight;
return inputPitch * inputHeight * depth;
}
......@@ -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_RENDERBUFFER_BINDING: *params = mState.renderbuffer.name(); return true;
case GL_CURRENT_PROGRAM: *params = mState.currentProgram; return true;
case GL_PACK_ALIGNMENT: *params = mState.packAlignment; return true;
case GL_UNPACK_ALIGNMENT: *params = mState.unpackInfo.alignment; return true;
case GL_PACK_ALIGNMENT: *params = mState.packParameters.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_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: *params = mState.fragmentShaderDerivativeHint; 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
*params = NUM_PROGRAM_BINARY_FORMATS;
return true;
case GL_PACK_ROW_LENGTH:
*params = mState.packRowLength;
*params = mState.packParameters.rowLength;
return true;
case GL_PACK_SKIP_PIXELS:
*params = mState.packSkipPixels;
*params = mState.packParameters.skipPixels;
return true;
case GL_PACK_SKIP_ROWS:
*params = mState.packSkipRows;
*params = mState.packParameters.skipRows;
return true;
case GL_PIXEL_PACK_BUFFER_BINDING:
*params = mState.pixelPackBuffer.name();
......@@ -2358,19 +2335,19 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
*params = static_cast<T>(mState.genericUniformBuffer->offset());
return true;
case GL_UNPACK_IMAGE_HEIGHT:
*params = mState.unpackInfo.imageHeight;
*params = mState.unpackParameters.imageHeight;
return true;
case GL_UNPACK_ROW_LENGTH:
*params = mState.unpackInfo.rowLength;
*params = mState.unpackParameters.rowLength;
return true;
case GL_UNPACK_SKIP_IMAGES:
*params = mState.unpackInfo.skipImages;
*params = mState.unpackParameters.skipImages;
return true;
case GL_UNPACK_SKIP_PIXELS:
*params = mState.unpackInfo.skipPixels;
*params = mState.unpackParameters.skipPixels;
return true;
case GL_UNPACK_SKIP_ROWS:
*params = mState.unpackInfo.skipRows;
*params = mState.unpackParameters.skipRows;
return true;
case GL_VERTEX_ARRAY_BINDING:
*params = getCurrentVertexArray()->name;
......@@ -3337,11 +3314,11 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum
return error(GL_INVALID_OPERATION);
}
GLsizei outputWidth = (mState.packRowLength > 0) ? mState.packRowLength : width;
GLsizei outputPitch = egl::ComputePitch(outputWidth, format, type, mState.packAlignment);
GLsizei outputHeight = (mState.packImageHeight == 0) ? height : mState.packImageHeight;
GLsizei outputWidth = (mState.packParameters.rowLength > 0) ? mState.packParameters.rowLength : width;
GLsizei outputPitch = egl::ComputePitch(outputWidth, format, type, mState.packParameters.alignment);
GLsizei outputHeight = (mState.packParameters.imageHeight == 0) ? height : mState.packParameters.imageHeight;
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
if(bufSize)
......
......@@ -422,13 +422,8 @@ struct State
gl::BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][MAX_COMBINED_TEXTURE_IMAGE_UNITS];
gl::BindingPointer<Query> activeQuery[QUERY_TYPE_COUNT];
egl::Image::UnpackInfo unpackInfo;
GLint packAlignment;
GLint packRowLength;
GLint packImageHeight;
GLint packSkipPixels;
GLint packSkipRows;
GLint packSkipImages;
egl::PixelStorageModes unpackParameters;
egl::PixelStorageModes packParameters;
};
class [[clang::lto_visibility_public]] Context : public egl::Context
......@@ -538,14 +533,12 @@ public:
void setUnpackSkipPixels(GLint skipPixels);
void setUnpackSkipRows(GLint skipRows);
void setUnpackSkipImages(GLint skipImages);
const egl::Image::UnpackInfo& getUnpackInfo() const;
const egl::PixelStorageModes &getUnpackParameters() const;
void setPackAlignment(GLint alignment);
void setPackRowLength(GLint rowLength);
void setPackImageHeight(GLint imageHeight);
void setPackSkipPixels(GLint skipPixels);
void setPackSkipRows(GLint skipRows);
void setPackSkipImages(GLint skipImages);
// These create and destroy methods are merely pass-throughs to
// ResourceManager, which owns these object types
......
......@@ -333,12 +333,12 @@ egl::Image *Texture::createSharedImage(GLenum target, unsigned int level)
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)
{
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
}
}
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)
{
......@@ -360,7 +360,7 @@ void Texture::subImage(egl::Context *context, GLint xoffset, GLint yoffset, GLin
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
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])
{
......@@ -548,7 +548,7 @@ void Texture2D::setImage(egl::Context *context, GLint level, GLsizei width, GLsi
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)
......@@ -610,9 +610,9 @@ void Texture2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GL
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)
......@@ -1037,9 +1037,9 @@ void TextureCubeMap::setCompressedImage(GLenum target, GLint level, GLenum forma
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)
......@@ -1230,7 +1230,7 @@ void TextureCubeMap::releaseTexImage()
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);
......@@ -1247,7 +1247,7 @@ void TextureCubeMap::setImage(egl::Context *context, GLenum target, GLint level,
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)
......@@ -1539,7 +1539,7 @@ int Texture3D::getTopLevel() const
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])
{
......@@ -1553,7 +1553,7 @@ void Texture3D::setImage(egl::Context *context, GLint level, GLsizei width, GLsi
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()
......@@ -1579,9 +1579,9 @@ void Texture3D::setCompressedImage(GLint level, GLenum format, GLsizei width, GL
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)
......
......@@ -112,8 +112,8 @@ public:
protected:
~Texture() override;
void setImage(egl::Context *context, 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::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::PixelStorageModes &unpackParameters, 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);
......@@ -160,9 +160,9 @@ public:
GLenum getType(GLenum target, GLint level) 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 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 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;
......@@ -226,10 +226,10 @@ public:
GLenum getType(GLenum target, GLint level) 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 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 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;
......@@ -288,9 +288,9 @@ public:
GLenum getType(GLenum target, GLint level) 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 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 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);
......
......@@ -5021,7 +5021,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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
{
......@@ -5032,7 +5032,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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
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))
{
......@@ -5407,7 +5407,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
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);
}
......@@ -6250,7 +6250,7 @@ void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei wi
}
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,
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
}
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
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
{
case GL_TEXTURE_2D:
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++)
{
texture->setImage(context, level, width, height, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr);
width = std::max(1, (width / 2));
height = std::max(1, (height / 2));
{
texture->setImage(context, level, width, height, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackParameters(), nullptr);
width = std::max(1, (width / 2));
height = std::max(1, (height / 2));
}
texture->makeImmutable(levels);
}
texture->makeImmutable(levels);
}
break;
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 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));
height = std::max(1, (height / 2));
texture->makeImmutable(levels);
}
texture->makeImmutable(levels);
}
break;
default:
return error(GL_INVALID_ENUM);
......@@ -3935,52 +3935,52 @@ GL_APICALL void GL_APIENTRY glTexStorage3D(GLenum target, GLsizei levels, GLenum
switch(target)
{
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);
}
es2::Texture3D *texture = context->getTexture3D();
if(!texture || texture->name == 0 || texture->getImmutableFormat() == GL_TRUE)
{
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)
{
return error(GL_INVALID_OPERATION);
}
for(int level = 0; level < levels; level++)
{
texture->setImage(context, level, width, height, depth, sizedInternalFormat, sizedInternalFormat, type, context->getUnpackInfo(), nullptr);
width = std::max(1, (width / 2));
height = std::max(1, (height / 2));
depth = std::max(1, (depth / 2));
{
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));
depth = std::max(1, (depth / 2));
}
texture->makeImmutable(levels);
}
texture->makeImmutable(levels);
}
break;
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 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));
height = std::max(1, (height / 2));
texture->makeImmutable(levels);
}
texture->makeImmutable(levels);
}
break;
default:
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