1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker // Based on Hello_Triangle.c from
8*8975f5c5SAndroid Build Coastguard Worker // Book: OpenGL(R) ES 2.0 Programming Guide
9*8975f5c5SAndroid Build Coastguard Worker // Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner
10*8975f5c5SAndroid Build Coastguard Worker // ISBN-10: 0321502795
11*8975f5c5SAndroid Build Coastguard Worker // ISBN-13: 9780321502797
12*8975f5c5SAndroid Build Coastguard Worker // Publisher: Addison-Wesley Professional
13*8975f5c5SAndroid Build Coastguard Worker // URLs: http://safari.informit.com/9780321563835
14*8975f5c5SAndroid Build Coastguard Worker // http://www.opengles-book.com
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker #include "SampleApplication.h"
17*8975f5c5SAndroid Build Coastguard Worker
18*8975f5c5SAndroid Build Coastguard Worker #include "texture_utils.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
20*8975f5c5SAndroid Build Coastguard Worker
21*8975f5c5SAndroid Build Coastguard Worker #include <cstring>
22*8975f5c5SAndroid Build Coastguard Worker #include <iostream>
23*8975f5c5SAndroid Build Coastguard Worker
24*8975f5c5SAndroid Build Coastguard Worker // This sample demonstrates the differences in rendering efficiency when
25*8975f5c5SAndroid Build Coastguard Worker // drawing with already-created textures whose dimensions have been altered
26*8975f5c5SAndroid Build Coastguard Worker // versus drawing with newly created textures.
27*8975f5c5SAndroid Build Coastguard Worker //
28*8975f5c5SAndroid Build Coastguard Worker // In order to support GL's per-level texture creation semantics over the
29*8975f5c5SAndroid Build Coastguard Worker // D3D API in particular, which requires textures' full mip chains to be
30*8975f5c5SAndroid Build Coastguard Worker // created at texture object creation time, ANGLE maintains copies of the
31*8975f5c5SAndroid Build Coastguard Worker // constituent texture images in system memory until the texture is used in
32*8975f5c5SAndroid Build Coastguard Worker // a draw call, at which time, if the texture passes GL's mip completeness
33*8975f5c5SAndroid Build Coastguard Worker // rules, the D3D texture is created and the contents of the texture are
34*8975f5c5SAndroid Build Coastguard Worker // uploaded. Once the texture is created, redefinition of the dimensions or
35*8975f5c5SAndroid Build Coastguard Worker // format of the texture is costly-- a new D3D texture needs to be created,
36*8975f5c5SAndroid Build Coastguard Worker // and ANGLE may need to read the contents back into system memory.
37*8975f5c5SAndroid Build Coastguard Worker //
38*8975f5c5SAndroid Build Coastguard Worker // Creating an entirely new texture also requires that a new D3D texture be
39*8975f5c5SAndroid Build Coastguard Worker // created, but any overhead associated with tracking the already-present
40*8975f5c5SAndroid Build Coastguard Worker // texture images is eliminated, as it's a novel texture. This sample
41*8975f5c5SAndroid Build Coastguard Worker // demonstrates the contrast in draw call time between these two situations.
42*8975f5c5SAndroid Build Coastguard Worker //
43*8975f5c5SAndroid Build Coastguard Worker // The resizing & creation of a new texture is delayed until several frames
44*8975f5c5SAndroid Build Coastguard Worker // after startup, to eliminate draw time differences caused by caching of
45*8975f5c5SAndroid Build Coastguard Worker // rendering state subsequent to the first frame.
46*8975f5c5SAndroid Build Coastguard Worker
47*8975f5c5SAndroid Build Coastguard Worker class TexRedefBenchSample : public SampleApplication
48*8975f5c5SAndroid Build Coastguard Worker {
49*8975f5c5SAndroid Build Coastguard Worker public:
TexRedefBenchSample(int argc,char ** argv)50*8975f5c5SAndroid Build Coastguard Worker TexRedefBenchSample(int argc, char **argv)
51*8975f5c5SAndroid Build Coastguard Worker : SampleApplication("Microbench", argc, argv, ClientType::ES2, 1280, 1280),
52*8975f5c5SAndroid Build Coastguard Worker mPixelsResize(nullptr),
53*8975f5c5SAndroid Build Coastguard Worker mPixelsNewTex(nullptr),
54*8975f5c5SAndroid Build Coastguard Worker mTimeFrame(false),
55*8975f5c5SAndroid Build Coastguard Worker mFrameCount(0)
56*8975f5c5SAndroid Build Coastguard Worker {}
57*8975f5c5SAndroid Build Coastguard Worker
defineSquareTexture2D(GLuint texId,GLsizei baseDimension,GLenum format,GLenum type,void * data)58*8975f5c5SAndroid Build Coastguard Worker void defineSquareTexture2D(GLuint texId,
59*8975f5c5SAndroid Build Coastguard Worker GLsizei baseDimension,
60*8975f5c5SAndroid Build Coastguard Worker GLenum format,
61*8975f5c5SAndroid Build Coastguard Worker GLenum type,
62*8975f5c5SAndroid Build Coastguard Worker void *data)
63*8975f5c5SAndroid Build Coastguard Worker {
64*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texId);
65*8975f5c5SAndroid Build Coastguard Worker GLsizei curDim = baseDimension;
66*8975f5c5SAndroid Build Coastguard Worker GLuint level = 0;
67*8975f5c5SAndroid Build Coastguard Worker
68*8975f5c5SAndroid Build Coastguard Worker while (curDim >= 1)
69*8975f5c5SAndroid Build Coastguard Worker {
70*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, level, format, curDim, curDim, 0, format, type, data);
71*8975f5c5SAndroid Build Coastguard Worker curDim /= 2;
72*8975f5c5SAndroid Build Coastguard Worker level++;
73*8975f5c5SAndroid Build Coastguard Worker }
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker
createPixelData()76*8975f5c5SAndroid Build Coastguard Worker void createPixelData()
77*8975f5c5SAndroid Build Coastguard Worker {
78*8975f5c5SAndroid Build Coastguard Worker mPixelsResize = new GLubyte[512 * 512 * 4];
79*8975f5c5SAndroid Build Coastguard Worker mPixelsNewTex = new GLubyte[512 * 512 * 4];
80*8975f5c5SAndroid Build Coastguard Worker GLubyte *pixPtr0 = mPixelsResize;
81*8975f5c5SAndroid Build Coastguard Worker GLubyte *pixPtr1 = mPixelsNewTex;
82*8975f5c5SAndroid Build Coastguard Worker GLubyte zeroPix[] = {0, 192, 192, 255};
83*8975f5c5SAndroid Build Coastguard Worker GLubyte onePix[] = {192, 0, 0, 255};
84*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < 512 * 512; ++i)
85*8975f5c5SAndroid Build Coastguard Worker {
86*8975f5c5SAndroid Build Coastguard Worker memcpy(pixPtr0, zeroPix, 4 * sizeof(GLubyte));
87*8975f5c5SAndroid Build Coastguard Worker memcpy(pixPtr1, onePix, 4 * sizeof(GLubyte));
88*8975f5c5SAndroid Build Coastguard Worker pixPtr0 += 4;
89*8975f5c5SAndroid Build Coastguard Worker pixPtr1 += 4;
90*8975f5c5SAndroid Build Coastguard Worker }
91*8975f5c5SAndroid Build Coastguard Worker }
92*8975f5c5SAndroid Build Coastguard Worker
initialize()93*8975f5c5SAndroid Build Coastguard Worker bool initialize() override
94*8975f5c5SAndroid Build Coastguard Worker {
95*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(attribute vec4 a_position;
96*8975f5c5SAndroid Build Coastguard Worker attribute vec2 a_texCoord;
97*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
98*8975f5c5SAndroid Build Coastguard Worker void main()
99*8975f5c5SAndroid Build Coastguard Worker {
100*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
101*8975f5c5SAndroid Build Coastguard Worker v_texCoord = a_texCoord;
102*8975f5c5SAndroid Build Coastguard Worker })";
103*8975f5c5SAndroid Build Coastguard Worker
104*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(precision mediump float;
105*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
106*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D s_texture;
107*8975f5c5SAndroid Build Coastguard Worker void main()
108*8975f5c5SAndroid Build Coastguard Worker {
109*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = texture2D(s_texture, v_texCoord);
110*8975f5c5SAndroid Build Coastguard Worker })";
111*8975f5c5SAndroid Build Coastguard Worker
112*8975f5c5SAndroid Build Coastguard Worker mProgram = CompileProgram(kVS, kFS);
113*8975f5c5SAndroid Build Coastguard Worker if (!mProgram)
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker return false;
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker
118*8975f5c5SAndroid Build Coastguard Worker // Get the attribute locations
119*8975f5c5SAndroid Build Coastguard Worker mPositionLoc = glGetAttribLocation(mProgram, "a_position");
120*8975f5c5SAndroid Build Coastguard Worker mTexCoordLoc = glGetAttribLocation(mProgram, "a_texCoord");
121*8975f5c5SAndroid Build Coastguard Worker
122*8975f5c5SAndroid Build Coastguard Worker // Get the sampler location
123*8975f5c5SAndroid Build Coastguard Worker mSamplerLoc = glGetUniformLocation(mProgram, "s_texture");
124*8975f5c5SAndroid Build Coastguard Worker
125*8975f5c5SAndroid Build Coastguard Worker // Generate texture IDs, and create texture 0
126*8975f5c5SAndroid Build Coastguard Worker glGenTextures(3, mTextureIds);
127*8975f5c5SAndroid Build Coastguard Worker
128*8975f5c5SAndroid Build Coastguard Worker createPixelData();
129*8975f5c5SAndroid Build Coastguard Worker defineSquareTexture2D(mTextureIds[0], 256, GL_RGBA, GL_UNSIGNED_BYTE, mPixelsResize);
130*8975f5c5SAndroid Build Coastguard Worker
131*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
132*8975f5c5SAndroid Build Coastguard Worker
133*8975f5c5SAndroid Build Coastguard Worker return true;
134*8975f5c5SAndroid Build Coastguard Worker }
135*8975f5c5SAndroid Build Coastguard Worker
destroy()136*8975f5c5SAndroid Build Coastguard Worker void destroy() override
137*8975f5c5SAndroid Build Coastguard Worker {
138*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mProgram);
139*8975f5c5SAndroid Build Coastguard Worker
140*8975f5c5SAndroid Build Coastguard Worker delete[] mPixelsResize;
141*8975f5c5SAndroid Build Coastguard Worker delete[] mPixelsNewTex;
142*8975f5c5SAndroid Build Coastguard Worker }
143*8975f5c5SAndroid Build Coastguard Worker
draw()144*8975f5c5SAndroid Build Coastguard Worker void draw() override
145*8975f5c5SAndroid Build Coastguard Worker {
146*8975f5c5SAndroid Build Coastguard Worker GLfloat vertices[] = {
147*8975f5c5SAndroid Build Coastguard Worker -0.5f, 0.5f, 0.0f, // Position 0
148*8975f5c5SAndroid Build Coastguard Worker 0.0f, 0.0f, // TexCoord 0
149*8975f5c5SAndroid Build Coastguard Worker -0.5f, -0.5f, 0.0f, // Position 1
150*8975f5c5SAndroid Build Coastguard Worker 0.0f, 1.0f, // TexCoord 1
151*8975f5c5SAndroid Build Coastguard Worker 0.5f, -0.5f, 0.0f, // Position 2
152*8975f5c5SAndroid Build Coastguard Worker 1.0f, 1.0f, // TexCoord 2
153*8975f5c5SAndroid Build Coastguard Worker 0.5f, 0.5f, 0.0f, // Position 3
154*8975f5c5SAndroid Build Coastguard Worker 1.0f, 0.0f // TexCoord 3
155*8975f5c5SAndroid Build Coastguard Worker };
156*8975f5c5SAndroid Build Coastguard Worker GLushort indices[] = {0, 1, 2, 0, 2, 3};
157*8975f5c5SAndroid Build Coastguard Worker
158*8975f5c5SAndroid Build Coastguard Worker // Set the viewport
159*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
160*8975f5c5SAndroid Build Coastguard Worker
161*8975f5c5SAndroid Build Coastguard Worker // Clear the color buffer
162*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
163*8975f5c5SAndroid Build Coastguard Worker
164*8975f5c5SAndroid Build Coastguard Worker // Use the program object
165*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
166*8975f5c5SAndroid Build Coastguard Worker
167*8975f5c5SAndroid Build Coastguard Worker // Load the vertex position
168*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), vertices);
169*8975f5c5SAndroid Build Coastguard Worker // Load the texture coordinate
170*8975f5c5SAndroid Build Coastguard Worker glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat),
171*8975f5c5SAndroid Build Coastguard Worker vertices + 3);
172*8975f5c5SAndroid Build Coastguard Worker
173*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(mPositionLoc);
174*8975f5c5SAndroid Build Coastguard Worker glEnableVertexAttribArray(mTexCoordLoc);
175*8975f5c5SAndroid Build Coastguard Worker
176*8975f5c5SAndroid Build Coastguard Worker // Bind the texture
177*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
178*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextureIds[0]);
179*8975f5c5SAndroid Build Coastguard Worker
180*8975f5c5SAndroid Build Coastguard Worker // Set the texture sampler to texture unit to 0
181*8975f5c5SAndroid Build Coastguard Worker glUniform1i(mSamplerLoc, 0);
182*8975f5c5SAndroid Build Coastguard Worker
183*8975f5c5SAndroid Build Coastguard Worker // We delay timing of texture resize/creation until after the first frame, as
184*8975f5c5SAndroid Build Coastguard Worker // caching optimizations will reduce draw time for subsequent frames for reasons
185*8975f5c5SAndroid Build Coastguard Worker // unreleated to texture creation. mTimeFrame is set to true on the fifth frame.
186*8975f5c5SAndroid Build Coastguard Worker if (mTimeFrame)
187*8975f5c5SAndroid Build Coastguard Worker {
188*8975f5c5SAndroid Build Coastguard Worker mOrigTimer.start();
189*8975f5c5SAndroid Build Coastguard Worker }
190*8975f5c5SAndroid Build Coastguard Worker
191*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
192*8975f5c5SAndroid Build Coastguard Worker
193*8975f5c5SAndroid Build Coastguard Worker if (mTimeFrame)
194*8975f5c5SAndroid Build Coastguard Worker {
195*8975f5c5SAndroid Build Coastguard Worker mOrigTimer.stop();
196*8975f5c5SAndroid Build Coastguard Worker // This timer indicates draw time for an already-created texture resident on the GPU,
197*8975f5c5SAndroid Build Coastguard Worker // which needs no updates. It will be faster than the other draws.
198*8975f5c5SAndroid Build Coastguard Worker std::cout << "Original texture draw: " << mOrigTimer.getElapsedWallClockTime() * 1000
199*8975f5c5SAndroid Build Coastguard Worker << "msec" << std::endl;
200*8975f5c5SAndroid Build Coastguard Worker
201*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
202*8975f5c5SAndroid Build Coastguard Worker
203*8975f5c5SAndroid Build Coastguard Worker // Now, change the texture dimensions of the original texture
204*8975f5c5SAndroid Build Coastguard Worker mResizeDefineTimer.start();
205*8975f5c5SAndroid Build Coastguard Worker defineSquareTexture2D(mTextureIds[0], 512, GL_RGBA, GL_UNSIGNED_BYTE, mPixelsResize);
206*8975f5c5SAndroid Build Coastguard Worker mResizeDefineTimer.stop();
207*8975f5c5SAndroid Build Coastguard Worker
208*8975f5c5SAndroid Build Coastguard Worker mResizeDrawTimer.start();
209*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
210*8975f5c5SAndroid Build Coastguard Worker mResizeDrawTimer.stop();
211*8975f5c5SAndroid Build Coastguard Worker // This timer indicates draw time for a texture which has already been used in a draw,
212*8975f5c5SAndroid Build Coastguard Worker // causing the underlying resource to be allocated, and then resized, requiring resource
213*8975f5c5SAndroid Build Coastguard Worker // reallocation and related overhead.
214*8975f5c5SAndroid Build Coastguard Worker std::cout << "Resized texture definition: "
215*8975f5c5SAndroid Build Coastguard Worker << mResizeDefineTimer.getElapsedWallClockTime() * 1000 << "msec" << std::endl;
216*8975f5c5SAndroid Build Coastguard Worker std::cout << "Resized texture draw: "
217*8975f5c5SAndroid Build Coastguard Worker << mResizeDrawTimer.getElapsedWallClockTime() * 1000 << "msec" << std::endl;
218*8975f5c5SAndroid Build Coastguard Worker
219*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
220*8975f5c5SAndroid Build Coastguard Worker
221*8975f5c5SAndroid Build Coastguard Worker // Create texure at same dimensions we resized previous texture to
222*8975f5c5SAndroid Build Coastguard Worker mNewTexDefineTimer.start();
223*8975f5c5SAndroid Build Coastguard Worker defineSquareTexture2D(mTextureIds[1], 512, GL_RGBA, GL_UNSIGNED_BYTE, mPixelsNewTex);
224*8975f5c5SAndroid Build Coastguard Worker mNewTexDefineTimer.stop();
225*8975f5c5SAndroid Build Coastguard Worker
226*8975f5c5SAndroid Build Coastguard Worker mNewTexDrawTimer.start();
227*8975f5c5SAndroid Build Coastguard Worker glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
228*8975f5c5SAndroid Build Coastguard Worker mNewTexDrawTimer.stop();
229*8975f5c5SAndroid Build Coastguard Worker // This timer indicates draw time for a texture newly created this frame. The underlying
230*8975f5c5SAndroid Build Coastguard Worker // resource will need to be created, but because it has not previously been used, there
231*8975f5c5SAndroid Build Coastguard Worker // is no already-resident texture object to manage. This draw is expected to be faster
232*8975f5c5SAndroid Build Coastguard Worker // than the resized texture draw.
233*8975f5c5SAndroid Build Coastguard Worker std::cout << "Newly created texture definition: "
234*8975f5c5SAndroid Build Coastguard Worker << mNewTexDefineTimer.getElapsedWallClockTime() * 1000 << "msec" << std::endl;
235*8975f5c5SAndroid Build Coastguard Worker std::cout << "Newly created texture draw: "
236*8975f5c5SAndroid Build Coastguard Worker << mNewTexDrawTimer.getElapsedWallClockTime() * 1000 << "msec" << std::endl;
237*8975f5c5SAndroid Build Coastguard Worker }
238*8975f5c5SAndroid Build Coastguard Worker
239*8975f5c5SAndroid Build Coastguard Worker if (mFrameCount == 5)
240*8975f5c5SAndroid Build Coastguard Worker mTimeFrame = true;
241*8975f5c5SAndroid Build Coastguard Worker else
242*8975f5c5SAndroid Build Coastguard Worker mTimeFrame = false;
243*8975f5c5SAndroid Build Coastguard Worker
244*8975f5c5SAndroid Build Coastguard Worker mFrameCount++;
245*8975f5c5SAndroid Build Coastguard Worker }
246*8975f5c5SAndroid Build Coastguard Worker
247*8975f5c5SAndroid Build Coastguard Worker private:
248*8975f5c5SAndroid Build Coastguard Worker // Handle to a program object
249*8975f5c5SAndroid Build Coastguard Worker GLuint mProgram;
250*8975f5c5SAndroid Build Coastguard Worker
251*8975f5c5SAndroid Build Coastguard Worker // Attribute locations
252*8975f5c5SAndroid Build Coastguard Worker GLint mPositionLoc;
253*8975f5c5SAndroid Build Coastguard Worker GLint mTexCoordLoc;
254*8975f5c5SAndroid Build Coastguard Worker
255*8975f5c5SAndroid Build Coastguard Worker // Sampler location
256*8975f5c5SAndroid Build Coastguard Worker GLint mSamplerLoc;
257*8975f5c5SAndroid Build Coastguard Worker
258*8975f5c5SAndroid Build Coastguard Worker // Texture handle
259*8975f5c5SAndroid Build Coastguard Worker GLuint mTextureIds[2]; // 0: texture created, then resized
260*8975f5c5SAndroid Build Coastguard Worker // 1: texture newly created with TexImage
261*8975f5c5SAndroid Build Coastguard Worker
262*8975f5c5SAndroid Build Coastguard Worker // Texture pixel data
263*8975f5c5SAndroid Build Coastguard Worker GLubyte *mPixelsResize;
264*8975f5c5SAndroid Build Coastguard Worker GLubyte *mPixelsNewTex;
265*8975f5c5SAndroid Build Coastguard Worker
266*8975f5c5SAndroid Build Coastguard Worker Timer mOrigTimer;
267*8975f5c5SAndroid Build Coastguard Worker Timer mResizeDrawTimer;
268*8975f5c5SAndroid Build Coastguard Worker Timer mResizeDefineTimer;
269*8975f5c5SAndroid Build Coastguard Worker Timer mNewTexDrawTimer;
270*8975f5c5SAndroid Build Coastguard Worker Timer mNewTexDefineTimer;
271*8975f5c5SAndroid Build Coastguard Worker bool mTimeFrame;
272*8975f5c5SAndroid Build Coastguard Worker unsigned int mFrameCount;
273*8975f5c5SAndroid Build Coastguard Worker };
274*8975f5c5SAndroid Build Coastguard Worker
main(int argc,char ** argv)275*8975f5c5SAndroid Build Coastguard Worker int main(int argc, char **argv)
276*8975f5c5SAndroid Build Coastguard Worker {
277*8975f5c5SAndroid Build Coastguard Worker TexRedefBenchSample app(argc, argv);
278*8975f5c5SAndroid Build Coastguard Worker return app.run();
279*8975f5c5SAndroid Build Coastguard Worker }
280