Edit

kc3-lang/angle/samples/gles1/DrawTexture.cpp

Branch :

  • Show log

    Commit

  • Author : Lingfeng Yang
    Date : 2018-07-12 12:52:06
    Hash : 0df813c3
    Message : GLES1: GL_OES_draw_texture BUG=angleproject:2306 This implements GL_OES_draw_texture using a few bits of new state in the renderer and adding a code path for it in the shader, using gl_VertexID to draw the quad backing the texture draw. This allows us to avoid allocating a separate vertex array for the texture draw and reuses the current shader as much as possible, plugging in to the existing multitexturing pipeline. - Add unit test and sample - No new test expectations, but advertising GL_OES_draw_texture makes the DrawTex GLES1 conformance test non-trivial and actually test glDrawTex*. Change-Id: I1485098249fe44d46a01cab4bb7b2c39d0492923 Reviewed-on: https://chromium-review.googlesource.com/1135930 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Lingfeng Yang <lfy@google.com>

  • samples/gles1/DrawTexture.cpp
  • //
    // Copyright 2018 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    //            Based on Simple_Texture2D.c from
    // Book:      OpenGL(R) ES 2.0 Programming Guide
    // Authors:   Aaftab Munshi, Dan Ginsburg, Dave Shreiner
    // ISBN-10:   0321502795
    // ISBN-13:   9780321502797
    // Publisher: Addison-Wesley Professional
    // URLs:      http://safari.informit.com/9780321563835
    //            http://www.opengles-book.com
    
    #include "SampleApplication.h"
    #include "shader_utils.h"
    #include "texture_utils.h"
    #include "util/system_utils.h"
    
    #include <GLES/gl.h>
    #include <GLES/glext.h>
    
    class GLES1DrawTextureSample : public SampleApplication
    {
      public:
        GLES1DrawTextureSample(int argc, char **argv)
            : SampleApplication("GLES1DrawTexture", argc, argv, 1, 0, 1280, 800)
        {
        }
    
        bool initialize() override
        {
            // Load the texture
            mTexture = CreateSimpleTexture2D();
    
            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glActiveTexture(GL_TEXTURE0);
            glEnable(GL_TEXTURE_2D);
    
            glActiveTexture(GL_TEXTURE0);
            glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, mTexture);
    
            GLint crop[4] = {0, 0, 2, 2};
            glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    
            glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
    
            return true;
        }
    
        void destroy() override { glDeleteTextures(1, &mTexture); }
    
        void draw() override
        {
            glClear(GL_COLOR_BUFFER_BIT);
    
            GLint windowWidth  = getWindow()->getWidth();
            GLint windowHeight = getWindow()->getHeight();
    
            glDrawTexiOES(mX, mY, 0, mWidth, mHeight);
            glDrawTexiOES(windowWidth - mX, mY, 0, mWidth, mHeight);
            glDrawTexiOES(mX, windowHeight - mY, 0, mWidth, mHeight);
            glDrawTexiOES(windowWidth - mX, windowHeight - mY, 0, mWidth, mHeight);
    
            mX += mReverseX ? -1 : 1;
            mY += mReverseY ? -1 : 1;
    
            if (mX + mWidth >= windowWidth)
                mReverseX = true;
            if (mX < 0)
                mReverseX = false;
    
            if (mY + mHeight >= windowHeight)
                mReverseY = true;
            if (mY < 0)
                mReverseY = false;
    
            ++mWidth;
            ++mHeight;
            if (mWidth >= windowWidth)
                mWidth = 0;
            if (mHeight >= windowHeight)
                mHeight = 0;
    
            angle::Sleep(16);
        }
    
      private:
        // Texture handle
        GLuint mTexture = 0;
    
        // Draw texture coordinates and dimensions to loop through
        GLint mX      = 0;
        GLint mY      = 0;
        GLint mWidth  = 0;
        GLint mHeight = 0;
    
        bool mReverseX = false;
        bool mReverseY = false;
    };
    
    int main(int argc, char **argv)
    {
        GLES1DrawTextureSample app(argc, argv);
        return app.run();
    }