Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 458197de authored by Mathias Agopian's avatar Mathias Agopian
Browse files

Fix ES2 composition on some devices

- turns out fragment shaders don't have default precision by default
- GLES 1.x extensions that became core in GLES 2.0 don't always work
  as extensions in GLES 2.0 (!)

Bug: 8679321
Change-Id: I5a4a93e158247910399325a965af5d2e3bbece9b
parent 6db4ff62
Loading
Loading
Loading
Loading
+31 −7
Original line number Original line Diff line number Diff line
@@ -15,12 +15,12 @@
 */
 */


#include <GLES/gl.h>
#include <GLES/gl.h>
#include <GLES/glext.h>


#include <utils/String8.h>
#include <utils/String8.h>
#include <cutils/compiler.h>
#include <cutils/compiler.h>


#include "GLES11RenderEngine.h"
#include "GLES11RenderEngine.h"
#include "GLExtensions.h"
#include "Mesh.h"
#include "Mesh.h"


// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
@@ -183,6 +183,31 @@ void GLES11RenderEngine::disableBlending() {
    glDisable(GL_BLEND);
    glDisable(GL_BLEND);
}
}


void GLES11RenderEngine::bindImageAsFramebuffer(EGLImageKHR image,
        uint32_t* texName, uint32_t* fbName, uint32_t* status) {
    GLuint tname, name;
    // turn our EGLImage into a texture
    glGenTextures(1, &tname);
    glBindTexture(GL_TEXTURE_2D, tname);
    glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)image);

    // create a Framebuffer Object to render into
    glGenFramebuffersOES(1, &name);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, name);
    glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES,
            GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, tname, 0);

    *status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
    *texName = tname;
    *fbName = name;
}

void GLES11RenderEngine::unbindFramebuffer(uint32_t texName, uint32_t fbName) {
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
    glDeleteFramebuffersOES(1, &fbName);
    glDeleteTextures(1, &texName);
}

void GLES11RenderEngine::fillWithColor(const Mesh& mesh, float r, float g, float b, float a) {
void GLES11RenderEngine::fillWithColor(const Mesh& mesh, float r, float g, float b, float a) {
    glColor4f(r, g, b, a);
    glColor4f(r, g, b, a);
    glDisable(GL_TEXTURE_EXTERNAL_OES);
    glDisable(GL_TEXTURE_EXTERNAL_OES);
@@ -219,14 +244,13 @@ void GLES11RenderEngine::drawMesh(const Mesh& mesh) {
}
}


void GLES11RenderEngine::dump(String8& result) {
void GLES11RenderEngine::dump(String8& result) {
    const GLExtensions& extensions(GLExtensions::getInstance());
    RenderEngine::dump(result);
    result.appendFormat("GLES: %s, %s, %s\n",
            extensions.getVendor(),
            extensions.getRenderer(),
            extensions.getVersion());
    result.appendFormat("%s\n", extensions.getExtension());
}
}


// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
}; // namespace android
}; // namespace android
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------

#if defined(__gl2_h_)
#error "don't include gl2/gl2.h in this file"
#endif
+4 −0
Original line number Original line Diff line number Diff line
@@ -37,6 +37,10 @@ class GLES11RenderEngine : public RenderEngine {
    GLint mMaxViewportDims[2];
    GLint mMaxViewportDims[2];
    GLint mMaxTextureSize;
    GLint mMaxTextureSize;


    virtual void bindImageAsFramebuffer(EGLImageKHR image,
            uint32_t* texName, uint32_t* fbName, uint32_t* status);
    virtual void unbindFramebuffer(uint32_t texName, uint32_t fbName);

public:
public:
    GLES11RenderEngine();
    GLES11RenderEngine();


+32 −7
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
#define ATRACE_TAG ATRACE_TAG_GRAPHICS
#define ATRACE_TAG ATRACE_TAG_GRAPHICS


#include <GLES2/gl2.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>


#include <utils/String8.h>
#include <utils/String8.h>
#include <utils/Trace.h>
#include <utils/Trace.h>
@@ -24,7 +25,6 @@
#include <cutils/compiler.h>
#include <cutils/compiler.h>


#include "GLES20RenderEngine.h"
#include "GLES20RenderEngine.h"
#include "GLExtensions.h"
#include "Program.h"
#include "Program.h"
#include "ProgramCache.h"
#include "ProgramCache.h"
#include "Description.h"
#include "Description.h"
@@ -157,6 +157,32 @@ void GLES20RenderEngine::disableBlending() {
    glDisable(GL_BLEND);
    glDisable(GL_BLEND);
}
}



void GLES20RenderEngine::bindImageAsFramebuffer(EGLImageKHR image,
        uint32_t* texName, uint32_t* fbName, uint32_t* status) {
    GLuint tname, name;
    // turn our EGLImage into a texture
    glGenTextures(1, &tname);
    glBindTexture(GL_TEXTURE_2D, tname);
    glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)image);

    // create a Framebuffer Object to render into
    glGenFramebuffers(1, &name);
    glBindFramebuffer(GL_FRAMEBUFFER, name);
    glFramebufferTexture2D(GL_FRAMEBUFFER,
            GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tname, 0);

    *status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    *texName = tname;
    *fbName = name;
}

void GLES20RenderEngine::unbindFramebuffer(uint32_t texName, uint32_t fbName) {
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glDeleteFramebuffers(1, &fbName);
    glDeleteTextures(1, &texName);
}

void GLES20RenderEngine::fillWithColor(const Mesh& mesh, float r, float g, float b, float a) {
void GLES20RenderEngine::fillWithColor(const Mesh& mesh, float r, float g, float b, float a) {
    mState.setColor(r, g, b, a);
    mState.setColor(r, g, b, a);
    disableTexturing();
    disableTexturing();
@@ -200,14 +226,13 @@ void GLES20RenderEngine::drawMesh(const Mesh& mesh) {
}
}


void GLES20RenderEngine::dump(String8& result) {
void GLES20RenderEngine::dump(String8& result) {
    const GLExtensions& extensions(GLExtensions::getInstance());
    RenderEngine::dump(result);
    result.appendFormat("GLES: %s, %s, %s\n",
            extensions.getVendor(),
            extensions.getRenderer(),
            extensions.getVersion());
    result.appendFormat("%s\n", extensions.getExtension());
}
}


// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
}; // namespace android
}; // namespace android
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------

#if defined(__gl_h_)
#error "don't include gl/gl.h in this file"
#endif
+4 −0
Original line number Original line Diff line number Diff line
@@ -41,6 +41,10 @@ class GLES20RenderEngine : public RenderEngine {


    Description mState;
    Description mState;


    virtual void bindImageAsFramebuffer(EGLImageKHR image,
            uint32_t* texName, uint32_t* fbName, uint32_t* status);
    virtual void unbindFramebuffer(uint32_t texName, uint32_t fbName);

public:
public:
    GLES20RenderEngine();
    GLES20RenderEngine();


+4 −0
Original line number Original line Diff line number Diff line
@@ -122,6 +122,10 @@ String8 ProgramCache::generateFragmentShader(const Key& needs) {
    if (needs.getTextureTarget() == Key::TEXTURE_EXT) {
    if (needs.getTextureTarget() == Key::TEXTURE_EXT) {
        fs << "#extension GL_OES_EGL_image_external : require";
        fs << "#extension GL_OES_EGL_image_external : require";
    }
    }

    // default precision is required-ish in fragment shaders
    fs << "precision mediump float;";

    if (needs.getTextureTarget() == Key::TEXTURE_EXT) {
    if (needs.getTextureTarget() == Key::TEXTURE_EXT) {
        fs << "uniform samplerExternalOES sampler;"
        fs << "uniform samplerExternalOES sampler;"
           << "varying vec2 outTexCoords;";
           << "varying vec2 outTexCoords;";
Loading