Hash :
0df813c3
Author :
Date :
2018-07-12T12:52:06
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>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
//
// 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();
}