Commit 9703d1a4 by Nicolas Capens

Provide framebuffer-specific color read format/type and optimize for them.

Bug 14643416 Change-Id: I5826ca98bdc964bec3ce9a6cd090872b7eb65c45 Reviewed-on: https://swiftshader-review.googlesource.com/1710Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 9f6e888f
......@@ -1873,11 +1873,41 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
dest32[i] = (argb & 0xFF00FF00) | ((argb & 0x000000FF) << 16) | ((argb & 0x00FF0000) >> 16);
}
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_X8R8G8B8 &&
format == GL_RGBA && type == GL_UNSIGNED_BYTE)
{
for(int i = 0; i < rect.x1 - rect.x0; i++)
{
unsigned int xrgb = *(unsigned int*)(source + 4 * i);
dest32[i] = (xrgb & 0xFF00FF00) | ((xrgb & 0x000000FF) << 16) | ((xrgb & 0x00FF0000) >> 16) | 0xFF000000;
}
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_X8R8G8B8 &&
format == GL_BGRA_EXT && type == GL_UNSIGNED_BYTE)
{
for(int i = 0; i < rect.x1 - rect.x0; i++)
{
unsigned int xrgb = *(unsigned int*)(source + 4 * i);
dest32[i] = xrgb | 0xFF000000;
}
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_A8R8G8B8 &&
format == GL_BGRA_EXT && type == GL_UNSIGNED_BYTE)
{
memcpy(dest, source, (rect.x1 - rect.x0) * 4);
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_A1R5G5B5 &&
format == GL_BGRA_EXT && type == GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT)
{
memcpy(dest, source, (rect.x1 - rect.x0) * 2);
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_R5G6B5 &&
format == 0x80E0 && type == GL_UNSIGNED_SHORT_5_6_5) // GL_BGR_EXT
{
memcpy(dest, source, (rect.x1 - rect.x0) * 2);
}
else
{
for(int i = 0; i < rect.x1 - rect.x0; i++)
......@@ -1939,22 +1969,6 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
r = (argb & 0x3FF00000) * (1.0f / 0x3FF00000);
}
break;
case sw::FORMAT_A32B32G32R32F:
{
r = *((float*)(source + 16 * i) + 0);
g = *((float*)(source + 16 * i) + 1);
b = *((float*)(source + 16 * i) + 2);
a = *((float*)(source + 16 * i) + 3);
}
break;
case sw::FORMAT_A16B16G16R16F:
{
r = (float)*((sw::half*)(source + 8 * i) + 0);
g = (float)*((sw::half*)(source + 8 * i) + 1);
b = (float)*((sw::half*)(source + 8 * i) + 2);
a = (float)*((sw::half*)(source + 8 * i) + 3);
}
break;
default:
UNIMPLEMENTED(); // FIXME
UNREACHABLE();
......
......@@ -400,14 +400,44 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
return GL_FRAMEBUFFER_COMPLETE_OES;
}
GLenum Framebuffer::getImplementationColorReadFormat()
{
return GL_RGB;
}
GLenum Framebuffer::getImplementationColorReadFormat()
{
Renderbuffer *colorbuffer = mColorbufferPointer.get();
if(colorbuffer)
{
switch(colorbuffer->getInternalFormat())
{
case sw::FORMAT_A8R8G8B8: return GL_BGRA_EXT;
case sw::FORMAT_X8R8G8B8: return GL_BGRA_EXT;
case sw::FORMAT_A1R5G5B5: return GL_BGRA_EXT;
case sw::FORMAT_R5G6B5: return 0x80E0; // GL_BGR_EXT
default:
UNREACHABLE();
}
}
return GL_RGBA;
}
GLenum Framebuffer::getImplementationColorReadType()
{
return GL_UNSIGNED_SHORT_5_6_5;
Renderbuffer *colorbuffer = mColorbufferPointer.get();
if(colorbuffer)
{
switch(colorbuffer->getInternalFormat())
{
case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_X8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_A1R5G5B5: return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT;
case sw::FORMAT_R5G6B5: return GL_UNSIGNED_SHORT_5_6_5;
default:
UNREACHABLE();
}
}
return GL_UNSIGNED_BYTE;
}
DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
......
......@@ -2308,10 +2308,6 @@ const GLubyte* GL_APIENTRY glGetString(GLenum name)
"GL_OES_rgb8_rgba8 "
"GL_OES_stencil8 "
"GL_OES_stencil_wrap "
"GL_OES_texture_float "
"GL_OES_texture_float_linear "
"GL_OES_texture_half_float "
"GL_OES_texture_half_float_linear "
"GL_OES_texture_mirrored_repeat "
"GL_OES_texture_npot "
"GL_EXT_blend_minmax "
......
......@@ -2206,11 +2206,51 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
dest32[i] = (argb & 0xFF00FF00) | ((argb & 0x000000FF) << 16) | ((argb & 0x00FF0000) >> 16);
}
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_X8R8G8B8 &&
format == GL_RGBA && type == GL_UNSIGNED_BYTE)
{
for(int i = 0; i < rect.x1 - rect.x0; i++)
{
unsigned int xrgb = *(unsigned int*)(source + 4 * i);
dest32[i] = (xrgb & 0xFF00FF00) | ((xrgb & 0x000000FF) << 16) | ((xrgb & 0x00FF0000) >> 16) | 0xFF000000;
}
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_X8R8G8B8 &&
format == GL_BGRA_EXT && type == GL_UNSIGNED_BYTE)
{
for(int i = 0; i < rect.x1 - rect.x0; i++)
{
unsigned int xrgb = *(unsigned int*)(source + 4 * i);
dest32[i] = xrgb | 0xFF000000;
}
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_A8R8G8B8 &&
format == GL_BGRA_EXT && type == GL_UNSIGNED_BYTE)
{
memcpy(dest, source, (rect.x1 - rect.x0) * 4);
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_A16B16G16R16F &&
format == GL_RGBA && type == GL_HALF_FLOAT_OES)
{
memcpy(dest, source, (rect.x1 - rect.x0) * 8);
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_A32B32G32R32F &&
format == GL_RGBA && type == GL_FLOAT)
{
memcpy(dest, source, (rect.x1 - rect.x0) * 16);
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_A1R5G5B5 &&
format == GL_BGRA_EXT && type == GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT)
{
memcpy(dest, source, (rect.x1 - rect.x0) * 2);
}
else if(renderTarget->getInternalFormat() == sw::FORMAT_R5G6B5 &&
format == 0x80E0 && type == GL_UNSIGNED_SHORT_5_6_5) // GL_BGR_EXT
{
memcpy(dest, source, (rect.x1 - rect.x0) * 2);
}
else
{
for(int i = 0; i < rect.x1 - rect.x0; i++)
......
......@@ -401,12 +401,46 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
GLenum Framebuffer::getImplementationColorReadFormat()
{
return GL_RGB;
Renderbuffer *colorbuffer = mColorbufferPointer.get();
if(colorbuffer)
{
switch(colorbuffer->getInternalFormat())
{
case sw::FORMAT_A16B16G16R16F: return GL_RGBA;
case sw::FORMAT_A32B32G32R32F: return GL_RGBA;
case sw::FORMAT_A8R8G8B8: return GL_BGRA_EXT;
case sw::FORMAT_X8R8G8B8: return GL_BGRA_EXT;
case sw::FORMAT_A1R5G5B5: return GL_BGRA_EXT;
case sw::FORMAT_R5G6B5: return 0x80E0; // GL_BGR_EXT
default:
UNREACHABLE();
}
}
return GL_RGBA;
}
GLenum Framebuffer::getImplementationColorReadType()
{
return GL_UNSIGNED_SHORT_5_6_5;
Renderbuffer *colorbuffer = mColorbufferPointer.get();
if(colorbuffer)
{
switch(colorbuffer->getInternalFormat())
{
case sw::FORMAT_A16B16G16R16F: return GL_HALF_FLOAT_OES;
case sw::FORMAT_A32B32G32R32F: return GL_FLOAT;
case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_X8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_A1R5G5B5: return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT;
case sw::FORMAT_R5G6B5: return GL_UNSIGNED_SHORT_5_6_5;
default:
UNREACHABLE();
}
}
return GL_UNSIGNED_BYTE;
}
DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
......
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