Commit dddc4ab7 by Nicolas Capens

Retrieve the implementation color read format/type from the framebuffer.

Bug 14643416 Change-Id: Icdacb4185839ef6fb71fe2ff651e283d55d447a9 Reviewed-on: https://swiftshader-review.googlesource.com/1701Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 54b721dd
...@@ -1039,8 +1039,18 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1039,8 +1039,18 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
} }
} }
break; break;
case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES: *params = IMPLEMENTATION_COLOR_READ_TYPE; break; case GL_IMPLEMENTATION_COLOR_READ_TYPE:
case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: *params = IMPLEMENTATION_COLOR_READ_FORMAT; break; {
Framebuffer *framebuffer = getFramebuffer();
*params = framebuffer->getImplementationColorReadType();
}
break;
case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
{
Framebuffer *framebuffer = getFramebuffer();
*params = framebuffer->getImplementationColorReadFormat();
}
break;
case GL_MAX_VIEWPORT_DIMS: case GL_MAX_VIEWPORT_DIMS:
{ {
int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE; int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE;
...@@ -1814,6 +1824,14 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -1814,6 +1824,14 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(format != GL_RGBA || type != GL_UNSIGNED_BYTE)
{
if(format != framebuffer->getImplementationColorReadFormat() || type != framebuffer->getImplementationColorReadType())
{
return error(GL_INVALID_OPERATION);
}
}
GLsizei outputPitch = ComputePitch(width, format, type, mState.packAlignment); GLsizei outputPitch = ComputePitch(width, format, type, mState.packAlignment);
// Sized query sanity check // Sized query sanity check
...@@ -1986,10 +2004,10 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -1986,10 +2004,10 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
default: UNREACHABLE(); default: UNREACHABLE();
} }
break; break;
case GL_RGB: // IMPLEMENTATION_COLOR_READ_FORMAT case GL_RGB:
switch(type) switch(type)
{ {
case GL_UNSIGNED_SHORT_5_6_5: // IMPLEMENTATION_COLOR_READ_TYPE case GL_UNSIGNED_SHORT_5_6_5:
dest16[i + j * outputPitch / sizeof(unsigned short)] = dest16[i + j * outputPitch / sizeof(unsigned short)] =
((unsigned short)(31 * b + 0.5f) << 0) | ((unsigned short)(31 * b + 0.5f) << 0) |
((unsigned short)(63 * g + 0.5f) << 5) | ((unsigned short)(63 * g + 0.5f) << 5) |
......
...@@ -71,9 +71,6 @@ enum ...@@ -71,9 +71,6 @@ enum
MAX_MODELVIEW_STACK_DEPTH = 32, MAX_MODELVIEW_STACK_DEPTH = 32,
MAX_PROJECTION_STACK_DEPTH = 2, MAX_PROJECTION_STACK_DEPTH = 2,
MAX_TEXTURE_STACK_DEPTH = 2, MAX_TEXTURE_STACK_DEPTH = 2,
IMPLEMENTATION_COLOR_READ_FORMAT = GL_RGB,
IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5
}; };
const GLenum compressedTextureFormats[] = const GLenum compressedTextureFormats[] =
......
...@@ -400,6 +400,16 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -400,6 +400,16 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
return GL_FRAMEBUFFER_COMPLETE_OES; return GL_FRAMEBUFFER_COMPLETE_OES;
} }
GLenum Framebuffer::getImplementationColorReadFormat()
{
return GL_RGB;
}
GLenum Framebuffer::getImplementationColorReadType()
{
return GL_UNSIGNED_SHORT_5_6_5;
}
DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil) DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
{ {
mColorbufferPointer.set(new Renderbuffer(0, colorbuffer)); mColorbufferPointer.set(new Renderbuffer(0, colorbuffer));
......
...@@ -63,6 +63,9 @@ public: ...@@ -63,6 +63,9 @@ public:
virtual GLenum completeness(); virtual GLenum completeness();
GLenum completeness(int &width, int &height, int &samples); GLenum completeness(int &width, int &height, int &samples);
GLenum getImplementationColorReadFormat();
GLenum getImplementationColorReadType();
protected: protected:
GLenum mColorbufferType; GLenum mColorbufferType;
gl::BindingPointer<Renderbuffer> mColorbufferPointer; gl::BindingPointer<Renderbuffer> mColorbufferPointer;
......
...@@ -80,47 +80,6 @@ static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei heigh ...@@ -80,47 +80,6 @@ static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei heigh
return true; return true;
} }
// Check for combinations of format and type that are valid for ReadPixels
static bool validReadFormatType(GLenum format, GLenum type)
{
switch(format)
{
case GL_RGBA:
switch (type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return false;
}
break;
case GL_BGRA_EXT:
switch (type)
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
break;
default:
return false;
}
break;
case es1::IMPLEMENTATION_COLOR_READ_FORMAT:
switch (type)
{
case es1::IMPLEMENTATION_COLOR_READ_TYPE:
break;
default:
return false;
}
break;
default:
return false;
}
return true;
}
extern "C" extern "C"
{ {
...@@ -612,8 +571,8 @@ void GL_APIENTRY glBlendFuncSeparateOES(GLenum srcRGB, GLenum dstRGB, GLenum src ...@@ -612,8 +571,8 @@ void GL_APIENTRY glBlendFuncSeparateOES(GLenum srcRGB, GLenum dstRGB, GLenum src
} }
void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
{ {
size = static_cast<GLint>(size); // Work around issues with some 64-bit applications size = static_cast<GLint>(size); // Work around issues with some 64-bit applications
TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)", TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
target, size, data, usage); target, size, data, usage);
...@@ -660,12 +619,12 @@ void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data ...@@ -660,12 +619,12 @@ void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data
} }
void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data) void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
{ {
size = static_cast<GLint>(size); // Work around issues with some 64-bit applications size = static_cast<GLint>(size); // Work around issues with some 64-bit applications
offset = static_cast<GLint>(offset); offset = static_cast<GLint>(offset);
TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)", TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
target, offset, size, data); target, offset, size, data);
if(size < 0 || offset < 0) if(size < 0 || offset < 0)
{ {
...@@ -2952,12 +2911,7 @@ void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, G ...@@ -2952,12 +2911,7 @@ void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, G
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(!validReadFormatType(format, type))
{
return error(GL_INVALID_OPERATION);
}
es1::Context *context = es1::getContext(); es1::Context *context = es1::getContext();
if(context) if(context)
......
...@@ -1358,8 +1358,18 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1358,8 +1358,18 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
} }
} }
break; break;
case GL_IMPLEMENTATION_COLOR_READ_TYPE: *params = IMPLEMENTATION_COLOR_READ_TYPE; break; case GL_IMPLEMENTATION_COLOR_READ_TYPE:
case GL_IMPLEMENTATION_COLOR_READ_FORMAT: *params = IMPLEMENTATION_COLOR_READ_FORMAT; break; {
Framebuffer *framebuffer = getReadFramebuffer();
*params = framebuffer->getImplementationColorReadType();
}
break;
case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
{
Framebuffer *framebuffer = getReadFramebuffer();
*params = framebuffer->getImplementationColorReadFormat();
}
break;
case GL_MAX_VIEWPORT_DIMS: case GL_MAX_VIEWPORT_DIMS:
{ {
int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE; int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE;
...@@ -2147,6 +2157,14 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -2147,6 +2157,14 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if(format != GL_RGBA || type != GL_UNSIGNED_BYTE)
{
if(format != framebuffer->getImplementationColorReadFormat() || type != framebuffer->getImplementationColorReadType())
{
return error(GL_INVALID_OPERATION);
}
}
GLsizei outputPitch = ComputePitch(width, format, type, mState.packAlignment); GLsizei outputPitch = ComputePitch(width, format, type, mState.packAlignment);
// Sized query sanity check // Sized query sanity check
...@@ -2319,10 +2337,10 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -2319,10 +2337,10 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
default: UNREACHABLE(); default: UNREACHABLE();
} }
break; break;
case GL_RGB: // IMPLEMENTATION_COLOR_READ_FORMAT case GL_RGB:
switch(type) switch(type)
{ {
case GL_UNSIGNED_SHORT_5_6_5: // IMPLEMENTATION_COLOR_READ_TYPE case GL_UNSIGNED_SHORT_5_6_5:
dest16[i + j * outputPitch / sizeof(unsigned short)] = dest16[i + j * outputPitch / sizeof(unsigned short)] =
((unsigned short)(31 * b + 0.5f) << 0) | ((unsigned short)(31 * b + 0.5f) << 0) |
((unsigned short)(63 * g + 0.5f) << 5) | ((unsigned short)(63 * g + 0.5f) << 5) |
......
...@@ -75,9 +75,6 @@ enum ...@@ -75,9 +75,6 @@ enum
MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS, MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS,
MAX_FRAGMENT_UNIFORM_VECTORS = 224 - 3, // Reserve space for gl_DepthRange MAX_FRAGMENT_UNIFORM_VECTORS = 224 - 3, // Reserve space for gl_DepthRange
MAX_DRAW_BUFFERS = 1, MAX_DRAW_BUFFERS = 1,
IMPLEMENTATION_COLOR_READ_FORMAT = GL_RGB,
IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5
}; };
const GLenum compressedTextureFormats[] = const GLenum compressedTextureFormats[] =
......
...@@ -399,6 +399,16 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -399,6 +399,16 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
return GL_FRAMEBUFFER_COMPLETE; return GL_FRAMEBUFFER_COMPLETE;
} }
GLenum Framebuffer::getImplementationColorReadFormat()
{
return GL_RGB;
}
GLenum Framebuffer::getImplementationColorReadType()
{
return GL_UNSIGNED_SHORT_5_6_5;
}
DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil) DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
{ {
mColorbufferPointer.set(new Renderbuffer(0, colorbuffer)); mColorbufferPointer.set(new Renderbuffer(0, colorbuffer));
......
...@@ -63,6 +63,9 @@ public: ...@@ -63,6 +63,9 @@ public:
virtual GLenum completeness(); virtual GLenum completeness();
GLenum completeness(int &width, int &height, int &samples); GLenum completeness(int &width, int &height, int &samples);
GLenum getImplementationColorReadFormat();
GLenum getImplementationColorReadType();
protected: protected:
GLenum mColorbufferType; GLenum mColorbufferType;
gl::BindingPointer<Renderbuffer> mColorbufferPointer; gl::BindingPointer<Renderbuffer> mColorbufferPointer;
......
...@@ -78,47 +78,6 @@ static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei heigh ...@@ -78,47 +78,6 @@ static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei heigh
return true; return true;
} }
// Check for combinations of format and type that are valid for ReadPixels
static bool validReadFormatType(GLenum format, GLenum type)
{
switch(format)
{
case GL_RGBA:
switch(type)
{
case GL_UNSIGNED_BYTE:
break;
default:
return false;
}
break;
case GL_BGRA_EXT:
switch(type)
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
break;
default:
return false;
}
break;
case es2::IMPLEMENTATION_COLOR_READ_FORMAT:
switch(type)
{
case es2::IMPLEMENTATION_COLOR_READ_TYPE:
break;
default:
return false;
}
break;
default:
return false;
}
return true;
}
extern "C" extern "C"
{ {
...@@ -3618,11 +3577,6 @@ void GL_APIENTRY glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei heigh ...@@ -3618,11 +3577,6 @@ void GL_APIENTRY glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei heigh
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(!validReadFormatType(format, type))
{
return error(GL_INVALID_OPERATION);
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
...@@ -3642,11 +3596,6 @@ void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, G ...@@ -3642,11 +3596,6 @@ void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, G
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
if(!validReadFormatType(format, type))
{
return error(GL_INVALID_OPERATION);
}
es2::Context *context = es2::getContext(); es2::Context *context = es2::getContext();
if(context) if(context)
......
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