Commit 53f4809c by Alexis Hetu Committed by Alexis Hétu

Enabled pixel unpack buffers

Setting pixel unpack buffers was already supported, but they were still unused. This cl enables them to be used as data when loading a texture. This fixes ~200 pbo related dEQP tests. Change-Id: Ibada594185dab4f14bebf892e4df817a7dfe8401 Reviewed-on: https://swiftshader-review.googlesource.com/5640Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 505b7711
...@@ -1533,6 +1533,13 @@ Buffer *Context::getGenericUniformBuffer() const ...@@ -1533,6 +1533,13 @@ Buffer *Context::getGenericUniformBuffer() const
return mState.genericUniformBuffer; return mState.genericUniformBuffer;
} }
const GLvoid* Context::getPixels(const GLvoid* data) const
{
es2::Buffer* unpackBuffer = getPixelUnpackBuffer();
const unsigned char* unpackBufferData = unpackBuffer ? static_cast<const unsigned char*>(unpackBuffer->data()) : nullptr;
return unpackBufferData ? unpackBufferData + (ptrdiff_t)(data) : data;
}
bool Context::getBuffer(GLenum target, es2::Buffer **buffer) const bool Context::getBuffer(GLenum target, es2::Buffer **buffer) const
{ {
switch(target) switch(target)
......
...@@ -634,6 +634,7 @@ public: ...@@ -634,6 +634,7 @@ public:
Buffer *getPixelPackBuffer() const; Buffer *getPixelPackBuffer() const;
Buffer *getPixelUnpackBuffer() const; Buffer *getPixelUnpackBuffer() const;
Buffer *getGenericUniformBuffer() const; Buffer *getGenericUniformBuffer() const;
const GLvoid* getPixels(const GLvoid* data) const;
bool getBuffer(GLenum target, es2::Buffer **buffer) const; bool getBuffer(GLenum target, es2::Buffer **buffer) const;
Program *getCurrentProgram() const; Program *getCurrentProgram() const;
Texture2D *getTexture2D() const; Texture2D *getTexture2D() const;
......
...@@ -955,7 +955,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -955,7 +955,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
if(validationError == GL_NONE) if(validationError == GL_NONE)
{ {
texture->subImageCompressed(level, xoffset, yoffset, width, height, sizedInternalFormat, imageSize, data); texture->subImageCompressed(level, xoffset, yoffset, width, height, sizedInternalFormat, imageSize, context->getPixels(data));
} }
else else
{ {
...@@ -970,7 +970,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -970,7 +970,7 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
if(validationError == GL_NONE) if(validationError == GL_NONE)
{ {
texture->subImageCompressed(target, level, xoffset, yoffset, width, height, sizedInternalFormat, imageSize, data); texture->subImageCompressed(target, level, xoffset, yoffset, width, height, sizedInternalFormat, imageSize, context->getPixels(data));
} }
else else
{ {
...@@ -5061,11 +5061,11 @@ GLboolean TestFenceNV(GLuint fence) ...@@ -5061,11 +5061,11 @@ GLboolean TestFenceNV(GLuint fence)
} }
void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
GLint border, GLenum format, GLenum type, const GLvoid* pixels) GLint border, GLenum format, GLenum type, const GLvoid* data)
{ {
TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, " TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
"GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = %p)", "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* data = %p)",
target, level, internalformat, width, height, border, format, type, pixels); target, level, internalformat, width, height, border, format, type, data);
if(!validImageSize(level, width, height)) if(!validImageSize(level, width, height))
{ {
...@@ -5142,7 +5142,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5142,7 +5142,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
texture->setImage(level, width, height, sizedInternalFormat, type, context->getUnpackInfo(), pixels); texture->setImage(level, width, height, sizedInternalFormat, type, context->getUnpackInfo(), context->getPixels(data));
} }
else else
{ {
...@@ -5153,7 +5153,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5153,7 +5153,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
texture->setImage(target, level, width, height, sizedInternalFormat, type, context->getUnpackInfo(), pixels); texture->setImage(target, level, width, height, sizedInternalFormat, type, context->getUnpackInfo(), context->getPixels(data));
} }
} }
} }
...@@ -5457,12 +5457,12 @@ void TexParameteriv(GLenum target, GLenum pname, const GLint* params) ...@@ -5457,12 +5457,12 @@ void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
} }
void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
GLenum format, GLenum type, const GLvoid* pixels) GLenum format, GLenum type, const GLvoid* data)
{ {
TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, " TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
"GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, " "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
"const GLvoid* pixels = %p)", "const GLvoid* data = %p)",
target, level, xoffset, yoffset, width, height, format, type, pixels); target, level, xoffset, yoffset, width, height, format, type, data);
if(!es2::IsTextureTarget(target)) if(!es2::IsTextureTarget(target))
{ {
...@@ -5489,7 +5489,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -5489,7 +5489,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
return; return;
} }
if(width == 0 || height == 0 || !pixels) if(width == 0 || height == 0)
{ {
return; return;
} }
...@@ -5508,7 +5508,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -5508,7 +5508,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
if(validationError == GL_NONE) if(validationError == GL_NONE)
{ {
texture->subImage(level, xoffset, yoffset, width, height, sizedInternalFormat, type, context->getUnpackInfo(), pixels); texture->subImage(level, xoffset, yoffset, width, height, sizedInternalFormat, type, context->getUnpackInfo(), context->getPixels(data));
} }
else else
{ {
...@@ -5523,7 +5523,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -5523,7 +5523,7 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
if(validationError == GL_NONE) if(validationError == GL_NONE)
{ {
texture->subImage(target, level, xoffset, yoffset, width, height, sizedInternalFormat, type, context->getUnpackInfo(), pixels); texture->subImage(target, level, xoffset, yoffset, width, height, sizedInternalFormat, type, context->getUnpackInfo(), context->getPixels(data));
} }
else else
{ {
...@@ -6283,12 +6283,12 @@ void BlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GL ...@@ -6283,12 +6283,12 @@ void BlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GL
} }
void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
GLint border, GLenum format, GLenum type, const GLvoid* pixels) GLint border, GLenum format, GLenum type, const GLvoid* data)
{ {
TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, " TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
"GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, " "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
"GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = %p)", "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* data = %p)",
target, level, internalformat, width, height, depth, border, format, type, pixels); target, level, internalformat, width, height, depth, border, format, type, data);
switch(target) switch(target)
{ {
...@@ -6338,16 +6338,16 @@ void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei wi ...@@ -6338,16 +6338,16 @@ void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei wi
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
texture->setImage(level, width, height, depth, GetSizedInternalFormat(internalformat, type), type, context->getUnpackInfo(), pixels); texture->setImage(level, width, height, depth, GetSizedInternalFormat(internalformat, type), type, context->getUnpackInfo(), context->getPixels(data));
} }
} }
void TexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels) void TexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
{ {
TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, " TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
"GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, " "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
"GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = %p)", "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* data = %p)",
target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
switch(target) switch(target)
{ {
...@@ -6383,7 +6383,7 @@ void TexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, ...@@ -6383,7 +6383,7 @@ void TexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLenum validationError = ValidateSubImageParams(false, width, height, depth, xoffset, yoffset, zoffset, target, level, sizedInternalFormat, texture); GLenum validationError = ValidateSubImageParams(false, width, height, depth, xoffset, yoffset, zoffset, target, level, sizedInternalFormat, texture);
if(validationError == GL_NONE) if(validationError == GL_NONE)
{ {
texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, sizedInternalFormat, type, context->getUnpackInfo(), pixels); texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, sizedInternalFormat, type, context->getUnpackInfo(), context->getPixels(data));
} }
else else
{ {
...@@ -6552,7 +6552,7 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint ...@@ -6552,7 +6552,7 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, context->getPixels(data));
} }
} }
......
...@@ -624,12 +624,12 @@ GL_APICALL void GL_APIENTRY glDrawRangeElements(GLenum mode, GLuint start, GLuin ...@@ -624,12 +624,12 @@ GL_APICALL void GL_APIENTRY glDrawRangeElements(GLenum mode, GLuint start, GLuin
} }
} }
GL_APICALL void GL_APIENTRY glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels) GL_APICALL void GL_APIENTRY glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *data)
{ {
TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, " TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
"GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, " "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
"GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = %p)", "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* data = %p)",
target, level, internalformat, width, height, depth, border, format, type, pixels); target, level, internalformat, width, height, depth, border, format, type, data);
switch(target) switch(target)
{ {
...@@ -677,16 +677,16 @@ GL_APICALL void GL_APIENTRY glTexImage3D(GLenum target, GLint level, GLint inter ...@@ -677,16 +677,16 @@ GL_APICALL void GL_APIENTRY glTexImage3D(GLenum target, GLint level, GLint inter
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
texture->setImage(level, width, height, depth, GetSizedInternalFormat(internalformat, type), type, context->getUnpackInfo(), pixels); texture->setImage(level, width, height, depth, GetSizedInternalFormat(internalformat, type), type, context->getUnpackInfo(), context->getPixels(data));
} }
} }
GL_APICALL void GL_APIENTRY glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels) GL_APICALL void GL_APIENTRY glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
{ {
TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, " TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
"GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, " "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
"GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = %p)", "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* data = %p)",
target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
switch(target) switch(target)
{ {
...@@ -723,7 +723,7 @@ GL_APICALL void GL_APIENTRY glTexSubImage3D(GLenum target, GLint level, GLint xo ...@@ -723,7 +723,7 @@ GL_APICALL void GL_APIENTRY glTexSubImage3D(GLenum target, GLint level, GLint xo
GLenum validationError = ValidateSubImageParams(false, width, height, depth, xoffset, yoffset, zoffset, target, level, sizedInternalFormat, texture); GLenum validationError = ValidateSubImageParams(false, width, height, depth, xoffset, yoffset, zoffset, target, level, sizedInternalFormat, texture);
if(validationError == GL_NONE) if(validationError == GL_NONE)
{ {
texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, sizedInternalFormat, type, context->getUnpackInfo(), pixels); texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, sizedInternalFormat, type, context->getUnpackInfo(), context->getPixels(data));
} }
else else
{ {
...@@ -907,7 +907,7 @@ GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level ...@@ -907,7 +907,7 @@ GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, context->getPixels(data));
} }
} }
......
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