Fix initial rbo state.
Renderbuffer objects are defined to have an initial internalformat of
GL_RGBA4, but the red/green/blue/alpha bits are 0. This inconsistency
is resolved by setting the internalformat to GL_NONE but reporting
GL_RGBA4 when queried.
Change-Id: Ie9a342c05eaa23f81773b37ebb942ca2e5b1addb
Reviewed-on: https://swiftshader-review.googlesource.com/14588
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/Renderbuffer.cpp b/src/OpenGL/libGLESv2/Renderbuffer.cpp
index 98a1c05..f1f6faa 100644
--- a/src/OpenGL/libGLESv2/Renderbuffer.cpp
+++ b/src/OpenGL/libGLESv2/Renderbuffer.cpp
@@ -402,7 +402,7 @@
{
mWidth = 0;
mHeight = 0;
- format = GL_RGBA4;
+ format = GL_NONE;
mSamples = 0;
}
diff --git a/src/OpenGL/libGLESv2/ResourceManager.cpp b/src/OpenGL/libGLESv2/ResourceManager.cpp
index e5c5492..04e1f0d 100644
--- a/src/OpenGL/libGLESv2/ResourceManager.cpp
+++ b/src/OpenGL/libGLESv2/ResourceManager.cpp
@@ -324,7 +324,7 @@
{
if(handle != 0 && !getRenderbuffer(handle))
{
- Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
+ Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_NONE, 0));
renderbufferObject->addRef();
mRenderbufferNameSpace.insert(handle, renderbufferObject);
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 5198ada..f612a63 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -3349,7 +3349,12 @@
{
case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
- case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getFormat(); break;
+ case GL_RENDERBUFFER_INTERNAL_FORMAT:
+ {
+ GLint internalformat = renderbuffer->getFormat();
+ *params = (internalformat == GL_NONE) ? GL_RGBA4 : internalformat;
+ }
+ break;
case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index c6ad075..a26edce 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -1135,6 +1135,11 @@
bool IsColorRenderable(GLint internalformat, GLint clientVersion)
{
+ if(IsCompressed(internalformat, clientVersion))
+ {
+ return false;
+ }
+
switch(internalformat)
{
case GL_RGBA4:
@@ -1201,6 +1206,11 @@
bool IsDepthRenderable(GLint internalformat, GLint clientVersion)
{
+ if(IsCompressed(internalformat, clientVersion))
+ {
+ return false;
+ }
+
switch(internalformat)
{
case GL_DEPTH_COMPONENT24:
@@ -1267,6 +1277,11 @@
bool IsStencilRenderable(GLint internalformat, GLint clientVersion)
{
+ if(IsCompressed(internalformat, clientVersion))
+ {
+ return false;
+ }
+
switch(internalformat)
{
case GL_STENCIL_INDEX8:
@@ -1353,6 +1368,7 @@
{
switch(internalformat)
{
+ case GL_NONE: return 0;
case GL_RGBA4: return 4;
case GL_RGB5_A1: return 1;
case GL_RGB565: return 0;
@@ -1392,7 +1408,7 @@
case GL_RGBA32UI: return 32;
case GL_R11F_G11F_B10F: return 0;
default:
- UNREACHABLE(internalformat);
+ // UNREACHABLE(internalformat);
return 0;
}
}
@@ -1401,6 +1417,7 @@
{
switch(internalformat)
{
+ case GL_NONE: return 0;
case GL_RGBA4: return 4;
case GL_RGB5_A1: return 5;
case GL_RGB565: return 5;
@@ -1440,7 +1457,7 @@
case GL_RGBA32UI: return 32;
case GL_R11F_G11F_B10F: return 11;
default:
- UNREACHABLE(internalformat);
+ // UNREACHABLE(internalformat);
return 0;
}
}
@@ -1449,6 +1466,7 @@
{
switch(internalformat)
{
+ case GL_NONE: return 0;
case GL_RGBA4: return 4;
case GL_RGB5_A1: return 5;
case GL_RGB565: return 6;
@@ -1488,7 +1506,7 @@
case GL_RGBA32UI: return 32;
case GL_R11F_G11F_B10F: return 11;
default:
- UNREACHABLE(internalformat);
+ // UNREACHABLE(internalformat);
return 0;
}
}
@@ -1497,6 +1515,7 @@
{
switch(internalformat)
{
+ case GL_NONE: return 0;
case GL_RGBA4: return 4;
case GL_RGB5_A1: return 5;
case GL_RGB565: return 5;
@@ -1536,7 +1555,7 @@
case GL_RGBA32UI: return 32;
case GL_R11F_G11F_B10F: return 10;
default:
- UNREACHABLE(internalformat);
+ // UNREACHABLE(internalformat);
return 0;
}
}
@@ -1553,7 +1572,7 @@
case GL_DEPTH24_STENCIL8: return 24;
case GL_DEPTH32F_STENCIL8: return 32;
default:
- UNREACHABLE(internalformat);
+ // UNREACHABLE(internalformat);
return 0;
}
}
@@ -1570,7 +1589,7 @@
case GL_DEPTH24_STENCIL8: return 8;
case GL_DEPTH32F_STENCIL8: return 8;
default:
- UNREACHABLE(internalformat);
+ // UNREACHABLE(internalformat);
return 0;
}
}
@@ -1637,7 +1656,7 @@
case GL_RGB9_E5:
return GL_FLOAT;
default:
- UNREACHABLE(internalformat);
+ // UNREACHABLE(internalformat);
return GL_NONE;
}
}
@@ -2061,6 +2080,7 @@
{
switch(format)
{
+ case GL_NONE: return sw::FORMAT_NULL;
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGBA8: return sw::FORMAT_A8B8G8R8;