Commit 400667e6 by Nicolas Capens

Fix floating-point color buffer support.

- Implemented GL_EXT_color_buffer_float. - Removed duplicate glRenderbufferStorageMultisample implementation. - Refactored internalformat validation. - Removed GL_R11F_G11F_B10F as renderable format. OpenGL ES 3.0 only supports this as a texture format. Change-Id: I83ce8225c1b310006f5ce983349ea8cb8b2f7c29 Reviewed-on: https://swiftshader-review.googlesource.com/9048Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 2ed3149a
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include <EGL/eglext.h> #include <EGL/eglext.h>
#include <algorithm> #include <algorithm>
#include <string>
namespace es2 namespace es2
{ {
...@@ -4254,84 +4255,90 @@ Device *Context::getDevice() ...@@ -4254,84 +4255,90 @@ Device *Context::getDevice()
return device; return device;
} }
const GLubyte* Context::getExtensions(GLuint index, GLuint* numExt) const const GLubyte *Context::getExtensions(GLuint index, GLuint *numExt) const
{ {
// Keep list sorted in following order: // Keep list sorted in following order:
// OES extensions // OES extensions
// EXT extensions // EXT extensions
// Vendor extensions // Vendor extensions
static const GLubyte* extensions[] = { static const char *es2extensions[] =
(const GLubyte*)"GL_OES_compressed_ETC1_RGB8_texture", {
(const GLubyte*)"GL_OES_depth24", "GL_OES_compressed_ETC1_RGB8_texture",
(const GLubyte*)"GL_OES_depth32", "GL_OES_depth24",
(const GLubyte*)"GL_OES_depth_texture", "GL_OES_depth32",
(const GLubyte*)"GL_OES_depth_texture_cube_map", "GL_OES_depth_texture",
(const GLubyte*)"GL_OES_EGL_image", "GL_OES_depth_texture_cube_map",
(const GLubyte*)"GL_OES_EGL_image_external", "GL_OES_EGL_image",
(const GLubyte*)"GL_OES_EGL_sync", "GL_OES_EGL_image_external",
(const GLubyte*)"GL_OES_element_index_uint", "GL_OES_EGL_sync",
(const GLubyte*)"GL_OES_framebuffer_object", "GL_OES_element_index_uint",
(const GLubyte*)"GL_OES_packed_depth_stencil", "GL_OES_framebuffer_object",
(const GLubyte*)"GL_OES_rgb8_rgba8", "GL_OES_packed_depth_stencil",
(const GLubyte*)"GL_OES_standard_derivatives", "GL_OES_rgb8_rgba8",
(const GLubyte*)"GL_OES_texture_float", "GL_OES_standard_derivatives",
(const GLubyte*)"GL_OES_texture_float_linear", "GL_OES_texture_float",
(const GLubyte*)"GL_OES_texture_half_float", "GL_OES_texture_float_linear",
(const GLubyte*)"GL_OES_texture_half_float_linear", "GL_OES_texture_half_float",
(const GLubyte*)"GL_OES_texture_npot", "GL_OES_texture_half_float_linear",
(const GLubyte*)"GL_OES_texture_3D", "GL_OES_texture_npot",
(const GLubyte*)"GL_EXT_blend_minmax", "GL_OES_texture_3D",
(const GLubyte*)"GL_EXT_color_buffer_half_float", "GL_EXT_blend_minmax",
(const GLubyte*)"GL_EXT_draw_buffers", "GL_EXT_color_buffer_half_float",
(const GLubyte*)"GL_EXT_occlusion_query_boolean", "GL_EXT_draw_buffers",
(const GLubyte*)"GL_EXT_read_format_bgra", "GL_EXT_instanced_arrays",
"GL_EXT_occlusion_query_boolean",
"GL_EXT_read_format_bgra",
#if (S3TC_SUPPORT) #if (S3TC_SUPPORT)
(const GLubyte*)"GL_EXT_texture_compression_dxt1", "GL_EXT_texture_compression_dxt1",
#endif #endif
(const GLubyte*)"GL_EXT_texture_filter_anisotropic", "GL_EXT_texture_filter_anisotropic",
(const GLubyte*)"GL_EXT_texture_format_BGRA8888", "GL_EXT_texture_format_BGRA8888",
(const GLubyte*)"GL_ANGLE_framebuffer_blit", "GL_ANGLE_framebuffer_blit",
(const GLubyte*)"GL_NV_framebuffer_blit", "GL_ANGLE_framebuffer_multisample",
(const GLubyte*)"GL_ANGLE_framebuffer_multisample", "GL_ANGLE_instanced_arrays",
#if (S3TC_SUPPORT) #if (S3TC_SUPPORT)
(const GLubyte*)"GL_ANGLE_texture_compression_dxt3", "GL_ANGLE_texture_compression_dxt3",
(const GLubyte*)"GL_ANGLE_texture_compression_dxt5", "GL_ANGLE_texture_compression_dxt5",
#endif #endif
(const GLubyte*)"GL_NV_fence", "GL_NV_fence",
(const GLubyte*)"GL_NV_read_depth", "GL_NV_framebuffer_blit",
(const GLubyte*)"GL_EXT_instanced_arrays", "GL_NV_read_depth",
(const GLubyte*)"GL_ANGLE_instanced_arrays",
}; };
static const GLuint numExtensions = sizeof(extensions) / sizeof(*extensions);
// Extensions exclusive to OpenGL ES 3.0 and above.
static const char *es3extensions[] =
{
"GL_EXT_color_buffer_float",
};
GLuint numES2extensions = sizeof(es2extensions) / sizeof(es2extensions[0]);
GLuint numExtensions = numES2extensions;
if(clientVersion >= 3)
{
numExtensions += sizeof(es3extensions) / sizeof(es3extensions[0]);
}
if(numExt) if(numExt)
{ {
*numExt = numExtensions; *numExt = numExtensions;
return nullptr; return nullptr;
} }
if(index == GL_INVALID_INDEX) if(index == GL_INVALID_INDEX)
{ {
static GLubyte* extensionsCat = nullptr; static std::string extensionsCat;
if(!extensionsCat && (numExtensions > 0))
if(extensionsCat.empty() && (numExtensions > 0))
{ {
size_t totalLength = numExtensions; // 1 space between each extension name + terminating null for(const char *extension : es2extensions)
for(unsigned int i = 0; i < numExtensions; i++)
{ {
totalLength += strlen(reinterpret_cast<const char*>(extensions[i])); extensionsCat += std::string(extension) + " ";
}
extensionsCat = new GLubyte[totalLength];
extensionsCat[0] = '\0';
for(unsigned int i = 0; i < numExtensions; i++)
{
if(i != 0)
{
strcat(reinterpret_cast<char*>(extensionsCat), " ");
}
strcat(reinterpret_cast<char*>(extensionsCat), reinterpret_cast<const char*>(extensions[i]));
} }
} }
return extensionsCat;
return (const GLubyte*)extensionsCat.c_str();
} }
if(index >= numExtensions) if(index >= numExtensions)
...@@ -4339,7 +4346,14 @@ const GLubyte* Context::getExtensions(GLuint index, GLuint* numExt) const ...@@ -4339,7 +4346,14 @@ const GLubyte* Context::getExtensions(GLuint index, GLuint* numExt) const
return nullptr; return nullptr;
} }
return extensions[index]; if(index < numES2extensions)
{
return (const GLubyte*)es2extensions[index];
}
else
{
return (const GLubyte*)es3extensions[index - numES2extensions];
}
} }
} }
......
...@@ -697,7 +697,7 @@ public: ...@@ -697,7 +697,7 @@ public:
Device *getDevice(); Device *getDevice();
const GLubyte* getExtensions(GLuint index, GLuint* numExt = nullptr) const; const GLubyte *getExtensions(GLuint index, GLuint *numExt = nullptr) const;
private: private:
virtual ~Context(); virtual ~Context();
......
...@@ -328,7 +328,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -328,7 +328,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
if(IsRenderbuffer(mColorbufferType[i])) if(IsRenderbuffer(mColorbufferType[i]))
{ {
if(!IsColorRenderable(colorbuffer->getFormat(), egl::getClientVersion())) if(!IsColorRenderable(colorbuffer->getFormat(), egl::getClientVersion(), false))
{ {
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
...@@ -337,7 +337,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -337,7 +337,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
{ {
GLenum format = colorbuffer->getFormat(); GLenum format = colorbuffer->getFormat();
if(!IsColorRenderable(format, egl::getClientVersion())) if(!IsColorRenderable(format, egl::getClientVersion(), true))
{ {
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
...@@ -386,7 +386,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -386,7 +386,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
if(IsRenderbuffer(mDepthbufferType)) if(IsRenderbuffer(mDepthbufferType))
{ {
if(!es2::IsDepthRenderable(depthbuffer->getFormat())) if(!es2::IsDepthRenderable(depthbuffer->getFormat(), egl::getClientVersion()))
{ {
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
...@@ -436,7 +436,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples) ...@@ -436,7 +436,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
if(IsRenderbuffer(mStencilbufferType)) if(IsRenderbuffer(mStencilbufferType))
{ {
if(!es2::IsStencilRenderable(stencilbuffer->getFormat())) if(!es2::IsStencilRenderable(stencilbuffer->getFormat(), egl::getClientVersion()))
{ {
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
} }
......
...@@ -4662,7 +4662,7 @@ void ReleaseShaderCompiler(void) ...@@ -4662,7 +4662,7 @@ void ReleaseShaderCompiler(void)
es2::Shader::releaseCompiler(); es2::Shader::releaseCompiler();
} }
void RenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
{ {
TRACE("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)", TRACE("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
target, samples, internalformat, width, height); target, samples, internalformat, width, height);
...@@ -4698,84 +4698,35 @@ void RenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum ...@@ -4698,84 +4698,35 @@ void RenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum
} }
GLint clientVersion = context->getClientVersion(); GLint clientVersion = context->getClientVersion();
switch(internalformat)
if(IsColorRenderable(internalformat, clientVersion, false))
{ {
case GL_DEPTH_COMPONENT32F:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
// fall through
case GL_DEPTH_COMPONENT16:
case GL_DEPTH_COMPONENT24:
case GL_DEPTH_COMPONENT32_OES:
context->setRenderbufferStorage(new es2::Depthbuffer(width, height, internalformat, samples));
break;
case GL_R8:
case GL_R8UI:
case GL_R8I:
case GL_R16UI:
case GL_R16I:
case GL_R32UI:
case GL_R32I:
case GL_RG8:
case GL_RG8UI:
case GL_RG8I:
case GL_RG16UI:
case GL_RG16I:
case GL_RG32UI:
case GL_RG32I:
case GL_SRGB8_ALPHA8:
case GL_RGB10_A2:
case GL_RGBA8UI:
case GL_RGBA8I:
case GL_RGB10_A2UI:
case GL_RGBA16UI:
case GL_RGBA16I:
case GL_RGBA32I:
case GL_RGBA32UI:
case GL_R11F_G11F_B10F:
case GL_R32F:
case GL_RG32F:
case GL_RGB32F:
case GL_RGBA32F:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
// fall through
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGB565:
case GL_RGB8_OES:
case GL_RGBA8_OES:
case GL_R16F:
case GL_RG16F:
case GL_RGB16F:
case GL_RGBA16F:
context->setRenderbufferStorage(new es2::Colorbuffer(width, height, internalformat, samples)); context->setRenderbufferStorage(new es2::Colorbuffer(width, height, internalformat, samples));
break; }
case GL_STENCIL_INDEX8: else if(IsDepthRenderable(internalformat, clientVersion) && IsStencilRenderable(internalformat, clientVersion))
context->setRenderbufferStorage(new es2::Stencilbuffer(width, height, samples)); {
break;
case GL_DEPTH32F_STENCIL8:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
// fall through
case GL_DEPTH24_STENCIL8_OES:
context->setRenderbufferStorage(new es2::DepthStencilbuffer(width, height, internalformat, samples)); context->setRenderbufferStorage(new es2::DepthStencilbuffer(width, height, internalformat, samples));
break;
default:
return error(GL_INVALID_ENUM);
} }
else if(IsDepthRenderable(internalformat, clientVersion))
{
context->setRenderbufferStorage(new es2::Depthbuffer(width, height, internalformat, samples));
}
else if(IsStencilRenderable(internalformat, clientVersion))
{
context->setRenderbufferStorage(new es2::Stencilbuffer(width, height, samples));
}
else error(GL_INVALID_ENUM);
} }
} }
void RenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
{
RenderbufferStorageMultisample(target, samples, internalformat, width, height);
}
void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
{ {
glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height); RenderbufferStorageMultisample(target, 0, internalformat, width, height);
} }
void SampleCoverage(GLclampf value, GLboolean invert) void SampleCoverage(GLclampf value, GLboolean invert)
......
...@@ -159,6 +159,7 @@ public: ...@@ -159,6 +159,7 @@ public:
GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); GLenum format, GLenum type, GLsizei bufSize, GLvoid *data);
void (*glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); void (*glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
void (*glReleaseShaderCompiler)(void); void (*glReleaseShaderCompiler)(void);
void (*glRenderbufferStorageMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
void (*glRenderbufferStorageMultisampleANGLE)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); void (*glRenderbufferStorageMultisampleANGLE)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
void (*glRenderbufferStorage)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); void (*glRenderbufferStorage)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
void (*glSampleCoverage)(GLclampf value, GLboolean invert); void (*glSampleCoverage)(GLclampf value, GLboolean invert);
......
...@@ -1450,103 +1450,6 @@ GL_APICALL void GL_APIENTRY glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint sr ...@@ -1450,103 +1450,6 @@ GL_APICALL void GL_APIENTRY glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint sr
} }
} }
GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
{
TRACE("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
target, samples, internalformat, width, height);
switch(target)
{
case GL_RENDERBUFFER:
break;
default:
return error(GL_INVALID_ENUM);
}
if(width < 0 || height < 0 || samples < 0)
{
return error(GL_INVALID_VALUE);
}
es2::Context *context = es2::getContext();
if(context)
{
if(width > es2::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE ||
height > es2::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE ||
samples > es2::IMPLEMENTATION_MAX_SAMPLES)
{
return error(GL_INVALID_VALUE);
}
GLuint handle = context->getRenderbufferName();
if(handle == 0)
{
return error(GL_INVALID_OPERATION);
}
switch(internalformat)
{
case GL_DEPTH_COMPONENT16:
case GL_DEPTH_COMPONENT24:
case GL_DEPTH_COMPONENT32_OES:
case GL_DEPTH_COMPONENT32F:
context->setRenderbufferStorage(new es2::Depthbuffer(width, height, internalformat, samples));
break;
case GL_R8UI:
case GL_R8I:
case GL_R16UI:
case GL_R16I:
case GL_R32UI:
case GL_R32I:
case GL_RG8UI:
case GL_RG8I:
case GL_RG16UI:
case GL_RG16I:
case GL_RG32UI:
case GL_RG32I:
case GL_RGB8UI:
case GL_RGB8I:
case GL_RGB16UI:
case GL_RGB16I:
case GL_RGB32UI:
case GL_RGB32I:
case GL_RGBA8UI:
case GL_RGBA8I:
case GL_RGB10_A2UI:
case GL_RGBA16UI:
case GL_RGBA16I:
case GL_RGBA32UI:
case GL_RGBA32I:
if(samples > 0)
{
return error(GL_INVALID_OPERATION);
}
case GL_RGBA4:
case GL_RGB5_A1:
case GL_RGB565:
case GL_SRGB8_ALPHA8:
case GL_RGB10_A2:
case GL_R8:
case GL_RG8:
case GL_RGB8:
case GL_RGBA8:
context->setRenderbufferStorage(new es2::Colorbuffer(width, height, internalformat, samples));
break;
case GL_STENCIL_INDEX8:
context->setRenderbufferStorage(new es2::Stencilbuffer(width, height, samples));
break;
case GL_DEPTH24_STENCIL8:
case GL_DEPTH32F_STENCIL8:
context->setRenderbufferStorage(new es2::DepthStencilbuffer(width, height, internalformat, samples));
break;
default:
return error(GL_INVALID_ENUM);
}
}
}
GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) GL_APICALL void GL_APIENTRY glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
{ {
TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %d, GLint level = %d, GLint layer = %d)", TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %d, GLint level = %d, GLint layer = %d)",
...@@ -3994,7 +3897,9 @@ GL_APICALL void GL_APIENTRY glGetInternalformativ(GLenum target, GLenum internal ...@@ -3994,7 +3897,9 @@ GL_APICALL void GL_APIENTRY glGetInternalformativ(GLenum target, GLenum internal
return; return;
} }
if(!IsColorRenderable(internalformat, egl::getClientVersion()) && !IsDepthRenderable(internalformat) && !IsStencilRenderable(internalformat)) if(!IsColorRenderable(internalformat, egl::getClientVersion(), false) &&
!IsDepthRenderable(internalformat, egl::getClientVersion()) &&
!IsStencilRenderable(internalformat, egl::getClientVersion()))
{ {
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
......
...@@ -269,6 +269,7 @@ void ReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height, ...@@ -269,6 +269,7 @@ void ReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); GLenum format, GLenum type, GLsizei bufSize, GLvoid *data);
void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
void ReleaseShaderCompiler(void); void ReleaseShaderCompiler(void);
void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
void RenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); void RenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
void SampleCoverage(GLclampf value, GLboolean invert); void SampleCoverage(GLclampf value, GLboolean invert);
...@@ -1007,6 +1008,11 @@ GL_APICALL void GL_APIENTRY glReleaseShaderCompiler(void) ...@@ -1007,6 +1008,11 @@ GL_APICALL void GL_APIENTRY glReleaseShaderCompiler(void)
return es2::ReleaseShaderCompiler(); return es2::ReleaseShaderCompiler();
} }
GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
{
return es2::RenderbufferStorageMultisample(target, samples, internalformat, width, height);
}
GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
{ {
return es2::RenderbufferStorageMultisampleANGLE(target, samples, internalformat, width, height); return es2::RenderbufferStorageMultisampleANGLE(target, samples, internalformat, width, height);
...@@ -1456,6 +1462,7 @@ LibGLESv2exports::LibGLESv2exports() ...@@ -1456,6 +1462,7 @@ LibGLESv2exports::LibGLESv2exports()
this->glReadnPixelsEXT = es2::ReadnPixelsEXT; this->glReadnPixelsEXT = es2::ReadnPixelsEXT;
this->glReadPixels = es2::ReadPixels; this->glReadPixels = es2::ReadPixels;
this->glReleaseShaderCompiler = es2::ReleaseShaderCompiler; this->glReleaseShaderCompiler = es2::ReleaseShaderCompiler;
this->glRenderbufferStorageMultisample = es2::RenderbufferStorageMultisample;
this->glRenderbufferStorageMultisampleANGLE = es2::RenderbufferStorageMultisampleANGLE; this->glRenderbufferStorageMultisampleANGLE = es2::RenderbufferStorageMultisampleANGLE;
this->glRenderbufferStorage = es2::RenderbufferStorage; this->glRenderbufferStorage = es2::RenderbufferStorage;
this->glSampleCoverage = es2::SampleCoverage; this->glSampleCoverage = es2::SampleCoverage;
......
...@@ -1038,12 +1038,13 @@ namespace es2 ...@@ -1038,12 +1038,13 @@ namespace es2
return true; return true;
} }
bool IsColorRenderable(GLenum internalformat, GLint clientVersion) bool IsColorRenderable(GLenum internalformat, GLint clientVersion, bool isTexture)
{ {
switch(internalformat) switch(internalformat)
{ {
case GL_RGB: case GL_RGB:
case GL_RGBA: case GL_RGBA:
return isTexture;
case GL_RGBA4: case GL_RGBA4:
case GL_RGB5_A1: case GL_RGB5_A1:
case GL_RGB565: case GL_RGB565:
...@@ -1053,6 +1054,10 @@ namespace es2 ...@@ -1053,6 +1054,10 @@ namespace es2
case GL_RG16F: case GL_RG16F:
case GL_RGB16F: case GL_RGB16F:
case GL_RGBA16F: case GL_RGBA16F:
case GL_R32F:
case GL_RG32F:
case GL_RGB32F:
case GL_RGBA32F:
case GL_BGRA8_EXT: case GL_BGRA8_EXT:
return true; return true;
case GL_R8: case GL_R8:
...@@ -1078,11 +1083,6 @@ namespace es2 ...@@ -1078,11 +1083,6 @@ namespace es2
case GL_RGBA16I: case GL_RGBA16I:
case GL_RGBA32I: case GL_RGBA32I:
case GL_RGBA32UI: case GL_RGBA32UI:
case GL_R11F_G11F_B10F:
case GL_R32F:
case GL_RG32F:
case GL_RGB32F:
case GL_RGBA32F:
return clientVersion >= 3; return clientVersion >= 3;
case GL_DEPTH_COMPONENT24: case GL_DEPTH_COMPONENT24:
case GL_DEPTH_COMPONENT32_OES: case GL_DEPTH_COMPONENT32_OES:
...@@ -1099,17 +1099,18 @@ namespace es2 ...@@ -1099,17 +1099,18 @@ namespace es2
return false; return false;
} }
bool IsDepthRenderable(GLenum internalformat) bool IsDepthRenderable(GLenum internalformat, GLint clientVersion)
{ {
switch(internalformat) switch(internalformat)
{ {
case GL_DEPTH_COMPONENT24: case GL_DEPTH_COMPONENT24:
case GL_DEPTH_COMPONENT32_OES:
case GL_DEPTH_COMPONENT32F:
case GL_DEPTH32F_STENCIL8:
case GL_DEPTH_COMPONENT16: case GL_DEPTH_COMPONENT16:
case GL_DEPTH24_STENCIL8_OES: case GL_DEPTH24_STENCIL8_OES: // GL_OES_packed_depth_stencil
case GL_DEPTH_COMPONENT32_OES: // GL_OES_depth32
return true; return true;
case GL_DEPTH32F_STENCIL8:
case GL_DEPTH_COMPONENT32F:
return clientVersion >= 3;
case GL_STENCIL_INDEX8: case GL_STENCIL_INDEX8:
case GL_R8: case GL_R8:
case GL_R8UI: case GL_R8UI:
...@@ -1158,14 +1159,15 @@ namespace es2 ...@@ -1158,14 +1159,15 @@ namespace es2
return false; return false;
} }
bool IsStencilRenderable(GLenum internalformat) bool IsStencilRenderable(GLenum internalformat, GLint clientVersion)
{ {
switch(internalformat) switch(internalformat)
{ {
case GL_DEPTH32F_STENCIL8:
case GL_STENCIL_INDEX8: case GL_STENCIL_INDEX8:
case GL_DEPTH24_STENCIL8_OES: case GL_DEPTH24_STENCIL8_OES:
return true; return true;
case GL_DEPTH32F_STENCIL8:
return clientVersion >= 3;
case GL_R8: case GL_R8:
case GL_R8UI: case GL_R8UI:
case GL_R8I: case GL_R8I:
......
...@@ -55,9 +55,9 @@ namespace es2 ...@@ -55,9 +55,9 @@ namespace es2
bool IsTextureTarget(GLenum target); bool IsTextureTarget(GLenum target);
bool ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLint clientVersion); bool ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLint clientVersion);
bool IsColorRenderable(GLenum internalformat, GLint clientVersion); bool IsColorRenderable(GLenum internalformat, GLint clientVersion, bool isTexture);
bool IsDepthRenderable(GLenum internalformat); bool IsDepthRenderable(GLenum internalformat, GLint clientVersion);
bool IsStencilRenderable(GLenum internalformat); bool IsStencilRenderable(GLenum internalformat, GLint clientVersion);
// Parse the base uniform name and array index. Returns the base name of the uniform. outSubscript is // Parse the base uniform name and array index. Returns the base name of the uniform. outSubscript is
// set to GL_INVALID_INDEX if the provided name is not an array or the array index is invalid. // set to GL_INVALID_INDEX if the provided name is not an array or the array index is invalid.
......
...@@ -2731,6 +2731,10 @@ namespace sw ...@@ -2731,6 +2731,10 @@ namespace sw
case FORMAT_A32B32G32R32I: case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI: case FORMAT_A32B32G32R32UI:
return false; return false;
case FORMAT_R16F:
case FORMAT_G16R16F:
case FORMAT_B16G16R16F:
case FORMAT_A16B16G16R16F:
case FORMAT_R32F: case FORMAT_R32F:
case FORMAT_G32R32F: case FORMAT_G32R32F:
case FORMAT_B32G32R32F: case FORMAT_B32G32R32F:
......
...@@ -2543,7 +2543,7 @@ namespace sw ...@@ -2543,7 +2543,7 @@ namespace sw
} }
{ {
value = (state.targetFormat[index] == FORMAT_X32B32G32R32F) ? Float4(1.0f) : *Pointer<Float4>(buffer + 16, 16); value = *Pointer<Float4>(buffer + 16, 16);
if(rgbaWriteMask != 0x0000000F) if(rgbaWriteMask != 0x0000000F)
{ {
......
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