Commit de6b75c6 by Nicolas Capens

Use matching internal and external formats for RGBA8 images.

Change-Id: I056e1a4c7ace83207bed85ce28aca187d72adc6f Reviewed-on: https://swiftshader-review.googlesource.com/2757Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent edb2e172
...@@ -406,10 +406,13 @@ GLenum Framebuffer::getImplementationColorReadFormat() ...@@ -406,10 +406,13 @@ GLenum Framebuffer::getImplementationColorReadFormat()
if(colorbuffer) if(colorbuffer)
{ {
// Don't return GL_RGBA since that's always supported. Provide a second option here.
switch(colorbuffer->getInternalFormat()) switch(colorbuffer->getInternalFormat())
{ {
case sw::FORMAT_A8R8G8B8: return GL_BGRA_EXT; case sw::FORMAT_A8R8G8B8: return GL_BGRA_EXT;
case sw::FORMAT_X8R8G8B8: return GL_BGRA_EXT; case sw::FORMAT_A8B8G8R8: return GL_BGRA_EXT;
case sw::FORMAT_X8R8G8B8: return 0x80E0; // GL_BGR_EXT
case sw::FORMAT_X8B8G8R8: return 0x80E0; // GL_BGR_EXT
case sw::FORMAT_A1R5G5B5: return GL_BGRA_EXT; case sw::FORMAT_A1R5G5B5: return GL_BGRA_EXT;
case sw::FORMAT_R5G6B5: return 0x80E0; // GL_BGR_EXT case sw::FORMAT_R5G6B5: return 0x80E0; // GL_BGR_EXT
default: default:
...@@ -429,7 +432,9 @@ GLenum Framebuffer::getImplementationColorReadType() ...@@ -429,7 +432,9 @@ GLenum Framebuffer::getImplementationColorReadType()
switch(colorbuffer->getInternalFormat()) switch(colorbuffer->getInternalFormat())
{ {
case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE; case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_A8B8G8R8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_X8R8G8B8: return GL_UNSIGNED_BYTE; case sw::FORMAT_X8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_X8B8G8R8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_A1R5G5B5: return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT; 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; case sw::FORMAT_R5G6B5: return GL_UNSIGNED_SHORT_5_6_5;
default: default:
......
...@@ -118,13 +118,17 @@ namespace es1 ...@@ -118,13 +118,17 @@ namespace es1
{ {
return sw::FORMAT_A8L8; return sw::FORMAT_A8L8;
} }
else if(format == GL_RGBA || format == GL_BGRA_EXT) else if(format == GL_RGBA)
{
return sw::FORMAT_A8B8G8R8;
}
else if(format == GL_BGRA_EXT)
{ {
return sw::FORMAT_A8R8G8B8; return sw::FORMAT_A8R8G8B8;
} }
else if(format == GL_RGB) else if(format == GL_RGB)
{ {
return sw::FORMAT_X8R8G8B8; return sw::FORMAT_X8B8G8R8;
} }
else if(format == GL_ALPHA) else if(format == GL_ALPHA)
{ {
...@@ -154,7 +158,7 @@ namespace es1 ...@@ -154,7 +158,7 @@ namespace es1
} }
else UNREACHABLE(); else UNREACHABLE();
return sw::FORMAT_A8R8G8B8; return sw::FORMAT_A8B8G8R8;
} }
void Image::loadImageData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint unpackAlignment, const void *input) void Image::loadImageData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint unpackAlignment, const void *input)
...@@ -184,10 +188,8 @@ namespace es1 ...@@ -184,10 +188,8 @@ namespace es1
loadRGBUByteImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); loadRGBUByteImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
break; break;
case GL_RGBA: case GL_RGBA:
loadRGBAUByteImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
break;
case GL_BGRA_EXT: case GL_BGRA_EXT:
loadBGRAImageData(xoffset, yoffset, width, height, inputPitch, input, buffer); loadRGBAUByteImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
break; break;
default: UNREACHABLE(); default: UNREACHABLE();
} }
...@@ -350,9 +352,9 @@ namespace es1 ...@@ -350,9 +352,9 @@ namespace es1
for(int x = 0; x < width; x++) for(int x = 0; x < width; x++)
{ {
dest[4 * x + 0] = source[x * 3 + 2]; dest[4 * x + 0] = source[x * 3 + 0];
dest[4 * x + 1] = source[x * 3 + 1]; dest[4 * x + 1] = source[x * 3 + 1];
dest[4 * x + 2] = source[x * 3 + 0]; dest[4 * x + 2] = source[x * 3 + 2];
dest[4 * x + 3] = 0xFF; dest[4 * x + 3] = 0xFF;
} }
} }
...@@ -400,11 +402,7 @@ namespace es1 ...@@ -400,11 +402,7 @@ namespace es1
const unsigned int *source = reinterpret_cast<const unsigned int*>(static_cast<const unsigned char*>(input) + y * inputPitch); const unsigned int *source = reinterpret_cast<const unsigned int*>(static_cast<const unsigned char*>(input) + y * inputPitch);
unsigned int *dest = reinterpret_cast<unsigned int*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4); unsigned int *dest = reinterpret_cast<unsigned int*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4);
for(int x = 0; x < width; x++) memcpy(dest, source, width * 4);
{
unsigned int rgba = source[x];
dest[x] = (rgba & 0xFF00FF00) | ((rgba << 16) & 0x00FF0000) | ((rgba >> 16) & 0x000000FF);
}
} }
} }
...@@ -455,17 +453,6 @@ namespace es1 ...@@ -455,17 +453,6 @@ namespace es1
} }
} }
void Image::loadBGRAImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const
{
for(int y = 0; y < height; y++)
{
const unsigned char *source = static_cast<const unsigned char*>(input) + y * inputPitch;
unsigned char *dest = static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4;
memcpy(dest, source, width*4);
}
}
void Image::loadD16ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const void Image::loadD16ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const
{ {
for(int y = 0; y < height; y++) for(int y = 0; y < height; y++)
......
...@@ -58,7 +58,6 @@ namespace es1 ...@@ -58,7 +58,6 @@ namespace es1
void loadRGBA4444ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const; void loadRGBA4444ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
void loadRGBA5551ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const; void loadRGBA5551ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
void loadRGBAFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const; void loadRGBAFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
void loadBGRAImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
void loadD16ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const; void loadD16ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
void loadD32ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const; void loadD32ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
void loadD24S8ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer); void loadD24S8ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer);
......
...@@ -250,7 +250,7 @@ RenderbufferStorage::RenderbufferStorage() ...@@ -250,7 +250,7 @@ RenderbufferStorage::RenderbufferStorage()
mWidth = 0; mWidth = 0;
mHeight = 0; mHeight = 0;
format = GL_RGBA4_OES; format = GL_RGBA4_OES;
internalFormat = sw::FORMAT_A8R8G8B8; internalFormat = sw::FORMAT_A8B8G8R8;
mSamples = 0; mSamples = 0;
} }
......
...@@ -444,9 +444,13 @@ void Texture2D::bindTexImage(egl::Surface *surface) ...@@ -444,9 +444,13 @@ void Texture2D::bindTexImage(egl::Surface *surface)
switch(surface->getInternalFormat()) switch(surface->getInternalFormat())
{ {
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8:
format = GL_BGRA_EXT;
break;
case sw::FORMAT_A8B8G8R8:
format = GL_RGBA; format = GL_RGBA;
break; break;
case sw::FORMAT_X8R8G8B8: case sw::FORMAT_X8B8G8R8:
case sw::FORMAT_X8R8G8B8:
format = GL_RGB; format = GL_RGB;
break; break;
default: default:
......
...@@ -458,13 +458,13 @@ namespace es2sw ...@@ -458,13 +458,13 @@ namespace es2sw
{ {
case GL_RGBA4_OES: case GL_RGBA4_OES:
case GL_RGB5_A1_OES: case GL_RGB5_A1_OES:
case GL_RGBA8_OES: return sw::FORMAT_A8R8G8B8; case GL_RGBA8_OES: return sw::FORMAT_A8B8G8R8;
case GL_RGB565_OES: return sw::FORMAT_R5G6B5; case GL_RGB565_OES: return sw::FORMAT_R5G6B5;
case GL_RGB8_OES: return sw::FORMAT_X8R8G8B8; case GL_RGB8_OES: return sw::FORMAT_X8B8G8R8;
case GL_DEPTH_COMPONENT16_OES: case GL_DEPTH_COMPONENT16_OES:
case GL_STENCIL_INDEX8_OES: case GL_STENCIL_INDEX8_OES:
case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8; case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8;
default: UNREACHABLE(); return sw::FORMAT_A8R8G8B8; default: UNREACHABLE(); return sw::FORMAT_A8B8G8R8;
} }
} }
...@@ -560,10 +560,12 @@ namespace sw2es ...@@ -560,10 +560,12 @@ namespace sw2es
case sw::FORMAT_A2R10G10B10: case sw::FORMAT_A2R10G10B10:
return 2; return 2;
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8:
case sw::FORMAT_A8B8G8R8:
return 8; return 8;
case sw::FORMAT_A1R5G5B5: case sw::FORMAT_A1R5G5B5:
return 1; return 1;
case sw::FORMAT_X8R8G8B8: case sw::FORMAT_X8R8G8B8:
case sw::FORMAT_X8B8G8R8:
case sw::FORMAT_R5G6B5: case sw::FORMAT_R5G6B5:
return 0; return 0;
default: default:
...@@ -582,7 +584,9 @@ namespace sw2es ...@@ -582,7 +584,9 @@ namespace sw2es
case sw::FORMAT_A2R10G10B10: case sw::FORMAT_A2R10G10B10:
return 10; return 10;
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8:
case sw::FORMAT_A8B8G8R8:
case sw::FORMAT_X8R8G8B8: case sw::FORMAT_X8R8G8B8:
case sw::FORMAT_X8B8G8R8:
return 8; return 8;
case sw::FORMAT_A1R5G5B5: case sw::FORMAT_A1R5G5B5:
case sw::FORMAT_R5G6B5: case sw::FORMAT_R5G6B5:
...@@ -603,7 +607,9 @@ namespace sw2es ...@@ -603,7 +607,9 @@ namespace sw2es
case sw::FORMAT_A2R10G10B10: case sw::FORMAT_A2R10G10B10:
return 10; return 10;
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8:
case sw::FORMAT_A8B8G8R8:
case sw::FORMAT_X8R8G8B8: case sw::FORMAT_X8R8G8B8:
case sw::FORMAT_X8B8G8R8:
return 8; return 8;
case sw::FORMAT_A1R5G5B5: case sw::FORMAT_A1R5G5B5:
return 5; return 5;
...@@ -625,7 +631,9 @@ namespace sw2es ...@@ -625,7 +631,9 @@ namespace sw2es
case sw::FORMAT_A2R10G10B10: case sw::FORMAT_A2R10G10B10:
return 10; return 10;
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8:
case sw::FORMAT_A8B8G8R8:
case sw::FORMAT_X8R8G8B8: case sw::FORMAT_X8R8G8B8:
case sw::FORMAT_X8B8G8R8:
return 8; return 8;
case sw::FORMAT_A1R5G5B5: case sw::FORMAT_A1R5G5B5:
case sw::FORMAT_R5G6B5: case sw::FORMAT_R5G6B5:
...@@ -661,9 +669,11 @@ namespace sw2es ...@@ -661,9 +669,11 @@ namespace sw2es
{ {
case sw::FORMAT_A4R4G4B4: return GL_RGBA4_OES; case sw::FORMAT_A4R4G4B4: return GL_RGBA4_OES;
case sw::FORMAT_A8R8G8B8: return GL_RGBA8_OES; case sw::FORMAT_A8R8G8B8: return GL_RGBA8_OES;
case sw::FORMAT_A8B8G8R8: return GL_RGBA8_OES;
case sw::FORMAT_A1R5G5B5: return GL_RGB5_A1_OES; case sw::FORMAT_A1R5G5B5: return GL_RGB5_A1_OES;
case sw::FORMAT_R5G6B5: return GL_RGB565_OES; case sw::FORMAT_R5G6B5: return GL_RGB565_OES;
case sw::FORMAT_X8R8G8B8: return GL_RGB8_OES; case sw::FORMAT_X8R8G8B8: return GL_RGB8_OES;
case sw::FORMAT_X8B8G8R8: return GL_RGB8_OES;
default: default:
UNREACHABLE(); UNREACHABLE();
} }
......
...@@ -405,12 +405,15 @@ GLenum Framebuffer::getImplementationColorReadFormat() ...@@ -405,12 +405,15 @@ GLenum Framebuffer::getImplementationColorReadFormat()
if(colorbuffer) if(colorbuffer)
{ {
// Don't return GL_RGBA since that's always supported. Provide a second option here.
switch(colorbuffer->getInternalFormat()) switch(colorbuffer->getInternalFormat())
{ {
case sw::FORMAT_A16B16G16R16F: return GL_RGBA; case sw::FORMAT_A16B16G16R16F: return GL_BGRA_EXT;
case sw::FORMAT_A32B32G32R32F: return GL_RGBA; case sw::FORMAT_A32B32G32R32F: return GL_BGRA_EXT;
case sw::FORMAT_A8R8G8B8: return GL_BGRA_EXT; case sw::FORMAT_A8R8G8B8: return GL_BGRA_EXT;
case sw::FORMAT_X8R8G8B8: return GL_BGRA_EXT; case sw::FORMAT_A8B8G8R8: return GL_BGRA_EXT;
case sw::FORMAT_X8R8G8B8: return 0x80E0; // GL_BGR_EXT
case sw::FORMAT_X8B8G8R8: return 0x80E0; // GL_BGR_EXT
case sw::FORMAT_A1R5G5B5: return GL_BGRA_EXT; case sw::FORMAT_A1R5G5B5: return GL_BGRA_EXT;
case sw::FORMAT_R5G6B5: return 0x80E0; // GL_BGR_EXT case sw::FORMAT_R5G6B5: return 0x80E0; // GL_BGR_EXT
default: default:
...@@ -432,7 +435,9 @@ GLenum Framebuffer::getImplementationColorReadType() ...@@ -432,7 +435,9 @@ GLenum Framebuffer::getImplementationColorReadType()
case sw::FORMAT_A16B16G16R16F: return GL_HALF_FLOAT_OES; case sw::FORMAT_A16B16G16R16F: return GL_HALF_FLOAT_OES;
case sw::FORMAT_A32B32G32R32F: return GL_FLOAT; case sw::FORMAT_A32B32G32R32F: return GL_FLOAT;
case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE; case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_A8B8G8R8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_X8R8G8B8: return GL_UNSIGNED_BYTE; case sw::FORMAT_X8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_X8B8G8R8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_A1R5G5B5: return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT; 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; case sw::FORMAT_R5G6B5: return GL_UNSIGNED_SHORT_5_6_5;
default: default:
......
...@@ -31,16 +31,15 @@ namespace ...@@ -31,16 +31,15 @@ namespace
LuminanceAlpha, LuminanceAlpha,
LuminanceAlphaFloat, LuminanceAlphaFloat,
LuminanceAlphaHalfFloat, LuminanceAlphaHalfFloat,
RGBUByte, UByteRGB,
RGB565, RGB565,
RGBFloat, FloatRGB,
RGBHalfFloat, HalfFloatRGB,
RGBAUByte, UByte4,
RGBA4444, RGBA4444,
RGBA5551, RGBA5551,
RGBAFloat, Float4,
RGBAHalfFloat, HalfFloat4,
BGRA,
D16, D16,
D24, D24,
D32, D32,
...@@ -162,15 +161,15 @@ namespace ...@@ -162,15 +161,15 @@ namespace
} }
template<> template<>
void LoadImageRow<RGBUByte>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width) void LoadImageRow<UByteRGB>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
{ {
unsigned char *destB = dest + xoffset * 4; unsigned char *destB = dest + xoffset * 4;
for(int x = 0; x < width; x++) for(int x = 0; x < width; x++)
{ {
destB[4 * x + 0] = source[x * 3 + 2]; destB[4 * x + 0] = source[x * 3 + 0];
destB[4 * x + 1] = source[x * 3 + 1]; destB[4 * x + 1] = source[x * 3 + 1];
destB[4 * x + 2] = source[x * 3 + 0]; destB[4 * x + 2] = source[x * 3 + 2];
destB[4 * x + 3] = 0xFF; destB[4 * x + 3] = 0xFF;
} }
} }
...@@ -192,7 +191,7 @@ namespace ...@@ -192,7 +191,7 @@ namespace
} }
template<> template<>
void LoadImageRow<RGBFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width) void LoadImageRow<FloatRGB>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
{ {
const float *sourceF = reinterpret_cast<const float*>(source); const float *sourceF = reinterpret_cast<const float*>(source);
float *destF = reinterpret_cast<float*>(dest + xoffset * 16); float *destF = reinterpret_cast<float*>(dest + xoffset * 16);
...@@ -207,7 +206,7 @@ namespace ...@@ -207,7 +206,7 @@ namespace
} }
template<> template<>
void LoadImageRow<RGBHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width) void LoadImageRow<HalfFloatRGB>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
{ {
const unsigned short *sourceH = reinterpret_cast<const unsigned short*>(source); const unsigned short *sourceH = reinterpret_cast<const unsigned short*>(source);
unsigned short *destH = reinterpret_cast<unsigned short*>(dest + xoffset * 8); unsigned short *destH = reinterpret_cast<unsigned short*>(dest + xoffset * 8);
...@@ -222,15 +221,14 @@ namespace ...@@ -222,15 +221,14 @@ namespace
} }
template<> template<>
void LoadImageRow<RGBAUByte>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width) void LoadImageRow<UByte4>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
{ {
const unsigned int *sourceI = reinterpret_cast<const unsigned int*>(source); const unsigned int *sourceI = reinterpret_cast<const unsigned int*>(source);
unsigned int *destI = reinterpret_cast<unsigned int*>(dest + xoffset * 4); unsigned int *destI = reinterpret_cast<unsigned int*>(dest + xoffset * 4);
for(int x = 0; x < width; x++) for(int x = 0; x < width; x++)
{ {
unsigned int rgba = sourceI[x]; memcpy(dest + xoffset * 4, source, width * 4);
destI[x] = (rgba & 0xFF00FF00) | ((rgba << 16) & 0x00FF0000) | ((rgba >> 16) & 0x000000FF);
} }
} }
...@@ -267,24 +265,18 @@ namespace ...@@ -267,24 +265,18 @@ namespace
} }
template<> template<>
void LoadImageRow<RGBAFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width) void LoadImageRow<Float4>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
{ {
memcpy(dest + xoffset * 16, source, width * 16); memcpy(dest + xoffset * 16, source, width * 16);
} }
template<> template<>
void LoadImageRow<RGBAHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width) void LoadImageRow<HalfFloat4>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
{ {
memcpy(dest + xoffset * 8, source, width * 8); memcpy(dest + xoffset * 8, source, width * 8);
} }
template<> template<>
void LoadImageRow<BGRA>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
{
memcpy(dest + xoffset * 4, source, width * 4);
}
template<>
void LoadImageRow<D16>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width) void LoadImageRow<D16>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
{ {
const unsigned short *sourceD16 = reinterpret_cast<const unsigned short*>(source); const unsigned short *sourceD16 = reinterpret_cast<const unsigned short*>(source);
...@@ -337,8 +329,8 @@ namespace ...@@ -337,8 +329,8 @@ namespace
{ {
for(int z = 0; z < depth; ++z) for(int z = 0; z < depth; ++z)
{ {
const unsigned char *inputStart = static_cast<const unsigned char*>(input)+(z * inputPitch * height); const unsigned char *inputStart = static_cast<const unsigned char*>(input) + (z * inputPitch * height);
unsigned char *destStart = static_cast<unsigned char*>(buffer)+((zoffset + z) * destPitch * destHeight); unsigned char *destStart = static_cast<unsigned char*>(buffer) + ((zoffset + z) * destPitch * destHeight);
for(int y = 0; y < height; ++y) for(int y = 0; y < height; ++y)
{ {
const unsigned char *source = inputStart + y * inputPitch; const unsigned char *source = inputStart + y * inputPitch;
...@@ -468,13 +460,17 @@ namespace es2 ...@@ -468,13 +460,17 @@ namespace es2
{ {
return sw::FORMAT_A8L8; return sw::FORMAT_A8L8;
} }
else if(format == GL_RGBA || format == GL_BGRA_EXT) else if(format == GL_RGBA)
{
return sw::FORMAT_A8B8G8R8;
}
else if(format == GL_BGRA_EXT)
{ {
return sw::FORMAT_A8R8G8B8; return sw::FORMAT_A8R8G8B8;
} }
else if(format == GL_RGB) else if(format == GL_RGB)
{ {
return sw::FORMAT_X8R8G8B8; return sw::FORMAT_X8B8G8R8;
} }
else if(format == GL_ALPHA) else if(format == GL_ALPHA)
{ {
...@@ -512,7 +508,7 @@ namespace es2 ...@@ -512,7 +508,7 @@ namespace es2
} }
else UNREACHABLE(); else UNREACHABLE();
return sw::FORMAT_A8R8G8B8; return sw::FORMAT_A8B8G8R8;
} }
void Image::loadImageData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint unpackAlignment, const void *input) void Image::loadImageData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint unpackAlignment, const void *input)
...@@ -537,13 +533,11 @@ namespace es2 ...@@ -537,13 +533,11 @@ namespace es2
LoadImageData<LuminanceAlpha>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer); LoadImageData<LuminanceAlpha>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break; break;
case GL_RGB: case GL_RGB:
LoadImageData<RGBUByte>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer); LoadImageData<UByteRGB>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break; break;
case GL_RGBA: case GL_RGBA:
LoadImageData<RGBAUByte>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break;
case GL_BGRA_EXT: case GL_BGRA_EXT:
LoadImageData<BGRA>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer); LoadImageData<UByte4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break; break;
default: UNREACHABLE(); default: UNREACHABLE();
} }
...@@ -578,7 +572,6 @@ namespace es2 ...@@ -578,7 +572,6 @@ namespace es2
case GL_FLOAT: case GL_FLOAT:
switch(format) switch(format)
{ {
// float textures are converted to RGBA, not BGRA
case GL_ALPHA: case GL_ALPHA:
LoadImageData<AlphaFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer); LoadImageData<AlphaFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break; break;
...@@ -589,10 +582,10 @@ namespace es2 ...@@ -589,10 +582,10 @@ namespace es2
LoadImageData<LuminanceAlphaFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer); LoadImageData<LuminanceAlphaFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break; break;
case GL_RGB: case GL_RGB:
LoadImageData<RGBFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer); LoadImageData<FloatRGB>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break; break;
case GL_RGBA: case GL_RGBA:
LoadImageData<RGBAFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer); LoadImageData<Float4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break; break;
default: UNREACHABLE(); default: UNREACHABLE();
} }
...@@ -600,7 +593,6 @@ namespace es2 ...@@ -600,7 +593,6 @@ namespace es2
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
switch(format) switch(format)
{ {
// float textures are converted to RGBA, not BGRA
case GL_ALPHA: case GL_ALPHA:
LoadImageData<AlphaHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer); LoadImageData<AlphaHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break; break;
...@@ -611,10 +603,10 @@ namespace es2 ...@@ -611,10 +603,10 @@ namespace es2
LoadImageData<LuminanceAlphaHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer); LoadImageData<LuminanceAlphaHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break; break;
case GL_RGB: case GL_RGB:
LoadImageData<RGBHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer); LoadImageData<HalfFloatRGB>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break; break;
case GL_RGBA: case GL_RGBA:
LoadImageData<RGBAHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer); LoadImageData<HalfFloat4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
break; break;
default: UNREACHABLE(); default: UNREACHABLE();
} }
...@@ -653,7 +645,7 @@ namespace es2 ...@@ -653,7 +645,7 @@ namespace es2
{ {
if(zoffset != 0 || depth != 1) if(zoffset != 0 || depth != 1)
{ {
UNIMPLEMENTED(); // FIXME UNIMPLEMENTED(); // FIXME
} }
int inputPitch = ComputeCompressedPitch(width, format); int inputPitch = ComputeCompressedPitch(width, format);
......
...@@ -386,7 +386,7 @@ RenderbufferStorage::RenderbufferStorage() ...@@ -386,7 +386,7 @@ RenderbufferStorage::RenderbufferStorage()
mWidth = 0; mWidth = 0;
mHeight = 0; mHeight = 0;
format = GL_RGBA4; format = GL_RGBA4;
internalFormat = sw::FORMAT_A8R8G8B8; internalFormat = sw::FORMAT_A8B8G8R8;
mSamples = 0; mSamples = 0;
} }
......
...@@ -444,9 +444,13 @@ void Texture2D::bindTexImage(egl::Surface *surface) ...@@ -444,9 +444,13 @@ void Texture2D::bindTexImage(egl::Surface *surface)
switch(surface->getInternalFormat()) switch(surface->getInternalFormat())
{ {
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8:
format = GL_BGRA_EXT;
break;
case sw::FORMAT_A8B8G8R8:
format = GL_RGBA; format = GL_RGBA;
break; break;
case sw::FORMAT_X8R8G8B8: case sw::FORMAT_X8B8G8R8:
case sw::FORMAT_X8R8G8B8:
format = GL_RGB; format = GL_RGB;
break; break;
default: default:
......
...@@ -673,13 +673,13 @@ namespace es2sw ...@@ -673,13 +673,13 @@ namespace es2sw
{ {
case GL_RGBA4: case GL_RGBA4:
case GL_RGB5_A1: case GL_RGB5_A1:
case GL_RGBA8_OES: return sw::FORMAT_A8R8G8B8; case GL_RGBA8_OES: return sw::FORMAT_A8B8G8R8;
case GL_RGB565: return sw::FORMAT_R5G6B5; case GL_RGB565: return sw::FORMAT_R5G6B5;
case GL_RGB8_OES: return sw::FORMAT_X8R8G8B8; case GL_RGB8_OES: return sw::FORMAT_X8B8G8R8;
case GL_DEPTH_COMPONENT16: case GL_DEPTH_COMPONENT16:
case GL_STENCIL_INDEX8: case GL_STENCIL_INDEX8:
case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8; case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8;
default: UNREACHABLE(); return sw::FORMAT_A8R8G8B8; default: UNREACHABLE(); return sw::FORMAT_A8B8G8R8;
} }
} }
} }
...@@ -722,10 +722,12 @@ namespace sw2es ...@@ -722,10 +722,12 @@ namespace sw2es
case sw::FORMAT_A2R10G10B10: case sw::FORMAT_A2R10G10B10:
return 2; return 2;
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8:
case sw::FORMAT_A8B8G8R8:
return 8; return 8;
case sw::FORMAT_A1R5G5B5: case sw::FORMAT_A1R5G5B5:
return 1; return 1;
case sw::FORMAT_X8R8G8B8: case sw::FORMAT_X8R8G8B8:
case sw::FORMAT_X8B8G8R8:
case sw::FORMAT_R5G6B5: case sw::FORMAT_R5G6B5:
return 0; return 0;
default: default:
...@@ -744,7 +746,9 @@ namespace sw2es ...@@ -744,7 +746,9 @@ namespace sw2es
case sw::FORMAT_A2R10G10B10: case sw::FORMAT_A2R10G10B10:
return 10; return 10;
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8:
case sw::FORMAT_A8B8G8R8:
case sw::FORMAT_X8R8G8B8: case sw::FORMAT_X8R8G8B8:
case sw::FORMAT_X8B8G8R8:
return 8; return 8;
case sw::FORMAT_A1R5G5B5: case sw::FORMAT_A1R5G5B5:
case sw::FORMAT_R5G6B5: case sw::FORMAT_R5G6B5:
...@@ -765,7 +769,9 @@ namespace sw2es ...@@ -765,7 +769,9 @@ namespace sw2es
case sw::FORMAT_A2R10G10B10: case sw::FORMAT_A2R10G10B10:
return 10; return 10;
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8:
case sw::FORMAT_A8B8G8R8:
case sw::FORMAT_X8R8G8B8: case sw::FORMAT_X8R8G8B8:
case sw::FORMAT_X8B8G8R8:
return 8; return 8;
case sw::FORMAT_A1R5G5B5: case sw::FORMAT_A1R5G5B5:
return 5; return 5;
...@@ -787,7 +793,9 @@ namespace sw2es ...@@ -787,7 +793,9 @@ namespace sw2es
case sw::FORMAT_A2R10G10B10: case sw::FORMAT_A2R10G10B10:
return 10; return 10;
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8:
case sw::FORMAT_A8B8G8R8:
case sw::FORMAT_X8R8G8B8: case sw::FORMAT_X8R8G8B8:
case sw::FORMAT_X8B8G8R8:
return 8; return 8;
case sw::FORMAT_A1R5G5B5: case sw::FORMAT_A1R5G5B5:
case sw::FORMAT_R5G6B5: case sw::FORMAT_R5G6B5:
...@@ -823,9 +831,11 @@ namespace sw2es ...@@ -823,9 +831,11 @@ namespace sw2es
{ {
case sw::FORMAT_A4R4G4B4: return GL_RGBA4; case sw::FORMAT_A4R4G4B4: return GL_RGBA4;
case sw::FORMAT_A8R8G8B8: return GL_RGBA8_OES; case sw::FORMAT_A8R8G8B8: return GL_RGBA8_OES;
case sw::FORMAT_A8B8G8R8: return GL_RGBA8_OES;
case sw::FORMAT_A1R5G5B5: return GL_RGB5_A1; case sw::FORMAT_A1R5G5B5: return GL_RGB5_A1;
case sw::FORMAT_R5G6B5: return GL_RGB565; case sw::FORMAT_R5G6B5: return GL_RGB565;
case sw::FORMAT_X8R8G8B8: return GL_RGB8_OES; case sw::FORMAT_X8R8G8B8: return GL_RGB8_OES;
case sw::FORMAT_X8B8G8R8: return GL_RGB8_OES;
default: default:
UNREACHABLE(); UNREACHABLE();
} }
......
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