OSDN Git Service

[interface][fbo] Pass extensions, GL_EXT_color_buffer_float
authorLingfeng Yang <lfy@google.com>
Fri, 27 Jan 2017 14:50:56 +0000 (06:50 -0800)
committerLingfeng Yang <lfy@google.com>
Fri, 27 Jan 2017 15:05:39 +0000 (07:05 -0800)
- Pass extensions from the underlying OpenGL to encoder for
validation.
- Add GL_EXT_color_buffer_float.

Change-Id: I67f8e68012bba9c5ffef24d9588a9615cf6f0e6b

system/GLESv2_enc/GL2Encoder.cpp
system/GLESv2_enc/GL2Encoder.h
system/GLESv2_enc/GLESv2Validation.cpp
system/GLESv2_enc/GLESv2Validation.h
system/egl/egl.cpp

index 5a3a62d..d263762 100755 (executable)
@@ -2280,9 +2280,15 @@ bool GL2Encoder::isCompleteFbo(GLenum target, const GLClientState* state,
         switch (fbo_format_info.rb_format) {
         case GL_R16F:
         case GL_RG16F:
-        case GL_RGB16F:
         case GL_RGBA16F:
-            res = false;
+        case GL_R32F:
+        case GL_RG32F:
+        case GL_RGBA32F:
+        case GL_R11F_G11F_B10F:
+            res = hasExtension("GL_EXT_color_buffer_float");
+            break;
+        case GL_RGB16F:
+            res = hasExtension("GL_EXT_color_buffer_half_float");
             break;
         case GL_STENCIL_INDEX8:
             if (attachment == GL_STENCIL_ATTACHMENT) {
@@ -2297,16 +2303,20 @@ bool GL2Encoder::isCompleteFbo(GLenum target, const GLClientState* state,
         break;
     case FBO_ATTACHMENT_TEXTURE:
         switch (fbo_format_info.tex_internalformat) {
-        case GL_RED:
-        case GL_RG:
         case GL_R16F:
         case GL_RG16F:
         case GL_RGBA16F:
-        case GL_RGB16F:
-        case GL_R11F_G11F_B10F:
         case GL_R32F:
         case GL_RG32F:
         case GL_RGBA32F:
+        case GL_R11F_G11F_B10F:
+            res = hasExtension("GL_EXT_color_buffer_float");
+            break;
+        case GL_RGB16F:
+            res = hasExtension("GL_EXT_color_buffer_half_float");
+            break;
+        case GL_RED:
+        case GL_RG:
         case GL_SRGB8:
         case GL_RGB32UI:
         case GL_RGB16UI:
@@ -3951,9 +3961,9 @@ void GL2Encoder::s_glGetInternalformativ(void* self, GLenum target, GLenum inter
                  GL_INVALID_ENUM);
     SET_ERROR_IF(!GLESv2Validation::internalFormatTarget(ctx, target), GL_INVALID_ENUM);
     SET_ERROR_IF(!GLESv2Validation::unsizedFormat(internalformat) &&
-                 !GLESv2Validation::colorRenderableFormat(internalformat) &&
-                 !GLESv2Validation::depthRenderableFormat(internalformat) &&
-                 !GLESv2Validation::stencilRenderableFormat(internalformat),
+                 !GLESv2Validation::colorRenderableFormat(ctx, internalformat) &&
+                 !GLESv2Validation::depthRenderableFormat(ctx, internalformat) &&
+                 !GLESv2Validation::stencilRenderableFormat(ctx, internalformat),
                  GL_INVALID_ENUM);
     SET_ERROR_IF(bufSize < 0, GL_INVALID_VALUE);
 
@@ -3992,8 +4002,8 @@ void GL2Encoder::s_glGenerateMipmap(void* self, GLenum target) {
                  GL_INVALID_OPERATION);
     SET_ERROR_IF(tex &&
                  !GLESv2Validation::unsizedFormat(internalformat) &&
-                 (!GLESv2Validation::colorRenderableFormat(internalformat) ||
-                  !GLESv2Validation::filterableTexFormat(internalformat)),
+                 !(GLESv2Validation::colorRenderableFormat(ctx, internalformat) &&
+                   GLESv2Validation::filterableTexFormat(ctx, internalformat)),
                  GL_INVALID_OPERATION);
 
     ctx->m_glGenerateMipmap_enc(ctx, target);
index 14d2c9a..928547c 100644 (file)
@@ -21,6 +21,8 @@
 #include "GLSharedGroup.h"
 #include "FixedBuffer.h"
 
+#include <string>
+
 class GL2Encoder : public gl2_encoder_context_t {
 public:
     GL2Encoder(IOStream *stream, ChecksumCalculator* protocol);
@@ -41,6 +43,12 @@ public:
     }
     int majorVersion() const { return m_currMajorVersion; }
     int minorVersion() const { return m_currMinorVersion; }
+    void setExtensions(const char* exts) {
+        m_currExtensions = std::string(exts);
+    }
+    bool hasExtension(const char* ext) const {
+        return m_currExtensions.find(ext) != std::string::npos;
+    }
     const GLClientState *state() { return m_state; }
     const GLSharedGroupPtr shared() { return m_shared; }
     void flush() { m_stream->flush(); }
@@ -66,6 +74,7 @@ private:
 
     int m_currMajorVersion;
     int m_currMinorVersion;
+    std::string m_currExtensions;
 
     bool    m_initialized;
     GLClientState *m_state;
index 0bf49e3..b2ccbdb 100644 (file)
@@ -109,6 +109,7 @@ bool pixelStoreValue(GLenum param, GLint value) {
 
 bool rboFormat(GL2Encoder* ctx, GLenum internalformat) {
     int glesMajorVersion = ctx->majorVersion();
+
     switch (internalformat) {
     // Funny internal formats
     // that will cause an incomplete framebuffer
@@ -139,24 +140,26 @@ bool rboFormat(GL2Encoder* ctx, GLenum internalformat) {
     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:
         return glesMajorVersion >= 3;
         // These 4 formats are still not OK,
         // but dEQP expects GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT or
-        // GL_FRAMEBUFFER_UNSUPPORTED,
+        // GL_FRAMEBUFFER_UNSUPPORTED if the extension is not present,
         // not a GL_INVALID_ENUM from earlier on.
         // So let's forward these to the rest of
         // FBO initialization
+        // In GLES 3, these are rejected immediately if not
+        // supported.
     case GL_R16F:
     case GL_RG16F:
-    case GL_RGB16F:
     case GL_RGBA16F:
-        // But in GLES 3, these are rejected immediately.
-        return glesMajorVersion < 3;
+    case GL_R32F:
+    case GL_RG32F:
+    case GL_RGBA32F:
+    case GL_R11F_G11F_B10F:
+        return glesMajorVersion < 3 || ctx->hasExtension("GL_EXT_color_buffer_float");
+    case GL_RGB16F:
+        return glesMajorVersion < 3 || ctx->hasExtension("GL_EXT_color_buffer_half_float");
         // dEQP expects GL_FRAMEBUFFER_UNSUPPORTED or GL_FRAMEBUFFER_COMPLETE
         // for this format
         // These formats are OK
@@ -480,15 +483,34 @@ bool supportedCompressedFormat(GL2Encoder* ctx, GLenum internalformat) {
     return true;
 }
 
+bool unsizedFormat(GLenum format) {
+    switch (format) {
+    case GL_RED:
+    case GL_RED_INTEGER:
+    case GL_DEPTH_COMPONENT:
+    case GL_DEPTH_STENCIL:
+    case GL_RG:
+    case GL_RG_INTEGER:
+    case GL_RGB:
+    case GL_RGB_INTEGER:
+    case GL_RGBA:
+    case GL_RGBA_INTEGER:
+    case GL_ALPHA:
+    case GL_LUMINANCE:
+    case GL_LUMINANCE_ALPHA:
+        return true;
+    }
+    return false;
+}
+
 // TODO: fix this
-bool filterableTexFormat(GLenum internalformat) {
+bool filterableTexFormat(GL2Encoder* ctx, GLenum internalformat) {
     switch (internalformat) {
-    // 32F's are not filterable.
     case GL_R32F:
     case GL_RG32F:
     case GL_RGB32F:
     case GL_RGBA32F:
-    // No integer textures are filterable.
+        return ctx->hasExtension("GL_OES_texture_float");
     case GL_R8UI:
     case GL_R8I:
     case GL_R16UI:
@@ -513,26 +535,8 @@ bool filterableTexFormat(GLenum internalformat) {
     return true;
 }
 
-bool unsizedFormat(GLenum format) {
-    switch (format) {
-    case GL_RED:
-    case GL_RED_INTEGER:
-    case GL_DEPTH_COMPONENT:
-    case GL_DEPTH_STENCIL:
-    case GL_RG:
-    case GL_RG_INTEGER:
-    case GL_RGB:
-    case GL_RGB_INTEGER:
-    case GL_RGBA:
-    case GL_RGBA_INTEGER:
-    case GL_ALPHA:
-    case GL_LUMINANCE:
-    case GL_LUMINANCE_ALPHA:
-        return true;
-    }
-    return false;
-}
-bool colorRenderableFormat(GLenum internalformat) {
+
+bool colorRenderableFormat(GL2Encoder* ctx, GLenum internalformat) {
     switch (internalformat) {
     case GL_R8:
     case GL_RG8:
@@ -563,11 +567,23 @@ bool colorRenderableFormat(GLenum internalformat) {
     case GL_RGBA32I:
     case GL_RGBA32UI:
         return true;
+    case GL_R16F:
+    case GL_RG16F:
+    case GL_RGBA16F:
+    case GL_R32F:
+    case GL_RG32F:
+    case GL_RGBA32F:
+    case GL_R11F_G11F_B10F:
+        return ctx->hasExtension("GL_EXT_color_buffer_float");
+        break;
+    case GL_RGB16F:
+        return ctx->hasExtension("GL_EXT_color_buffer_half_float");
+        break;
     }
     return false;
 }
 
-bool depthRenderableFormat(GLenum internalformat) {
+bool depthRenderableFormat(GL2Encoder* ctx, GLenum internalformat) {
     switch (internalformat) {
     case GL_DEPTH_COMPONENT:
     case GL_DEPTH_STENCIL:
@@ -581,7 +597,7 @@ bool depthRenderableFormat(GLenum internalformat) {
     return false;
 }
 
-bool stencilRenderableFormat(GLenum internalformat) {
+bool stencilRenderableFormat(GL2Encoder* ctx, GLenum internalformat) {
     switch (internalformat) {
     case GL_DEPTH_STENCIL:
     case GL_STENCIL_INDEX8:
index 9fe9278..981589c 100644 (file)
@@ -54,11 +54,13 @@ GLsizei compressedTexImageSize(GLenum internalformat, GLsizei width, GLsizei hei
 
 bool isCompressedFormat(GLenum internalformat);
 bool supportedCompressedFormat(GL2Encoder* ctx, GLenum internalformat);
-bool filterableTexFormat(GLenum internalformat);
+
 bool unsizedFormat(GLenum format);
-bool colorRenderableFormat(GLenum internalformat);
-bool depthRenderableFormat(GLenum internalformat);
-bool stencilRenderableFormat(GLenum internalformat);
+
+bool filterableTexFormat(GL2Encoder* ctx, GLenum internalformat);
+bool colorRenderableFormat(GL2Encoder* ctx, GLenum internalformat);
+bool depthRenderableFormat(GL2Encoder* ctx, GLenum internalformat);
+bool stencilRenderableFormat(GL2Encoder* ctx, GLenum internalformat);
 
 bool isCubeMapTarget(GLenum target);
 
index 7dcd836..275971c 100644 (file)
@@ -1538,7 +1538,7 @@ EGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLC
                     max_draw_buffers);
         }
 
-        //set the client state
+        // set the client state and share group
         if (context->majorVersion > 1) {
             hostCon->gl2Encoder()->setClientStateMakeCurrent(
                     contextState,
@@ -1578,6 +1578,10 @@ EGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLC
                 hostCon->gl2Encoder()->setInitialized();
                 ClientAPIExts::initClientFuncs(s_display.gles2_iface(), 1);
             }
+            const char* exts = getGLString(GL_EXTENSIONS);
+            if (exts) {
+                hostCon->gl2Encoder()->setExtensions(exts);
+            }
         }
         else {
             if (!hostCon->glEncoder()->isInitialized()) {