1f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt/*
2f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt * Copyright 2015 Google Inc.
3f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt *
4f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt * Use of this source code is governed by a BSD-style license that can be
5f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt * found in the LICENSE file.
6f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt */
7f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
8f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt#include "Benchmark.h"
9f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt#include "SkCanvas.h"
10f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt#include "SkImageEncoder.h"
1174a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt
12f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt#if SK_SUPPORT_GPU
1374a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt#include "GLBench.h"
1494efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon#include "GrShaderCaps.h"
1599938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon#include "GrShaderVar.h"
16f529439fea003851d986a0573a7e0465754b2a48egdaniel#include "gl/GrGLContext.h"
17f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt#include "gl/GrGLInterface.h"
18f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt#include "gl/GrGLUtil.h"
1994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon#include "../private/GrGLSL.h"
20f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt#include <stdio.h>
21f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
22f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt/*
23f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt * This is a native GL benchmark for determining the cost of uploading vertex attributes
24f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt */
2574a07db2df189320d4f5804078dc2085b2d38d7cjoshualittclass GLVertexAttributesBench : public GLBench {
26f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittpublic:
27f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GLVertexAttributesBench(uint32_t attribs)
28f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        : fTexture(0)
29f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        , fBuffers(0)
30f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        , fProgram(0)
31f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        , fVBO(0)
32f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        , fAttribs(attribs)
33f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        , fStride(2 * sizeof(SkPoint) + fAttribs * sizeof(GrGLfloat) * 4) {
34f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        fName.appendf("GLVertexAttributesBench_%d", fAttribs);
35f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
36f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
37f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittprotected:
38f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    const char* onGetName() override { return fName.c_str(); }
3974a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    void setup(const GrGLContext*) override;
40a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void glDraw(int loops, const GrGLContext*) override;
4174a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    void teardown(const GrGLInterface*) override;
42f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
43f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    static const GrGLuint kScreenWidth = 800;
44f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    static const GrGLuint kScreenHeight = 600;
45f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    static const uint32_t kNumTri = 10000;
46f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    static const uint32_t kVerticesPerTri = 3;
47f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    static const uint32_t kDrawMultiplier = 512;
48f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    static const uint32_t kMaxAttribs = 7;
49f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
50f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittprivate:
5174a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    GrGLuint setupShader(const GrGLContext*, uint32_t attribs, uint32_t maxAttribs);
5274a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt
53f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GrGLuint fTexture;
54f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    SkTArray<GrGLuint> fBuffers;
55f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GrGLuint fProgram;
56f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GrGLuint fVBO;
57f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    SkTArray<unsigned char> fVertices;
58f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    uint32_t fAttribs;
59f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    size_t fStride;
60f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    SkString fName;
61f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    typedef Benchmark INHERITED;
62f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt};
63f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
64f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt///////////////////////////////////////////////////////////////////////////////////////////////////
65f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
6674a07db2df189320d4f5804078dc2085b2d38d7cjoshualittGrGLuint GLVertexAttributesBench::setupShader(const GrGLContext* ctx, uint32_t attribs,
6774a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt                                              uint32_t maxAttribs) {
681edc5b92fecefb79f01cf0e302646eacf32b06c7Brian Salomon    const GrShaderCaps* shaderCaps = ctx->caps()->shaderCaps();
691edc5b92fecefb79f01cf0e302646eacf32b06c7Brian Salomon    const char* version = shaderCaps->versionDeclString();
70f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
71f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    // setup vertex shader
7299938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon    GrShaderVar aPosition("a_position", kVec4f_GrSLType, GrShaderVar::kIn_TypeModifier);
7399938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon    SkTArray<GrShaderVar> aVars;
7499938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon    SkTArray<GrShaderVar> oVars;
75f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
76f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    SkString vshaderTxt(version);
771edc5b92fecefb79f01cf0e302646eacf32b06c7Brian Salomon    aPosition.appendDecl(shaderCaps, &vshaderTxt);
78f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    vshaderTxt.append(";\n");
79f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
80f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    for (uint32_t i = 0; i < attribs; i++) {
81f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        SkString aname;
82f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        aname.appendf("a_color_%d", i);
8399938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon        aVars.push_back(GrShaderVar(aname.c_str(),
8499938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon                                    kVec4f_GrSLType,
8599938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon                                    GrShaderVar::kIn_TypeModifier));
861edc5b92fecefb79f01cf0e302646eacf32b06c7Brian Salomon        aVars.back().appendDecl(shaderCaps, &vshaderTxt);
87f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        vshaderTxt.append(";\n");
88f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
89f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
90f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
91f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    for (uint32_t i = 0; i < maxAttribs; i++) {
92f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        SkString oname;
93f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        oname.appendf("o_color_%d", i);
9499938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon        oVars.push_back(GrShaderVar(oname.c_str(),
9599938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon                                    kVec4f_GrSLType,
9699938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon                                    GrShaderVar::kOut_TypeModifier));
971edc5b92fecefb79f01cf0e302646eacf32b06c7Brian Salomon        oVars.back().appendDecl(shaderCaps, &vshaderTxt);
98f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        vshaderTxt.append(";\n");
99f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
100f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
101f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    vshaderTxt.append(
102f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt            "void main()\n"
103f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt            "{\n"
104f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt                "gl_Position = a_position;\n");
105f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
106f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    for (uint32_t i = 0; i < attribs; i++) {
107f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        vshaderTxt.appendf("%s = %s;\n", oVars[i].c_str(), aVars[i].c_str());
108f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
109f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
110f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    // Passthrough position as a dummy
111f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    for (uint32_t i = attribs; i < maxAttribs; i++) {
112bd929d95704d052a5c8477b881761eff03582487joshualitt        vshaderTxt.appendf("%s = vec4(0, 0, 0, 1);\n", oVars[i].c_str());
113f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
114f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
115f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    vshaderTxt.append("}\n");
116f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
117f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    // setup fragment shader
11899938a8ef24e2dd5b39f78638742e9b50ab6d9bfBrian Salomon    GrShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, GrShaderVar::kOut_TypeModifier);
119f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    SkString fshaderTxt(version);
1201edc5b92fecefb79f01cf0e302646eacf32b06c7Brian Salomon    GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, *shaderCaps, &fshaderTxt);
121f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
122f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    const char* fsOutName;
1231edc5b92fecefb79f01cf0e302646eacf32b06c7Brian Salomon    if (shaderCaps->mustDeclareFragmentShaderOutput()) {
1241edc5b92fecefb79f01cf0e302646eacf32b06c7Brian Salomon        oFragColor.appendDecl(shaderCaps, &fshaderTxt);
125f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        fshaderTxt.append(";\n");
126f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        fsOutName = oFragColor.c_str();
127f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    } else {
1285961bc9278a00e56dacdd9408d0744b5a0a3b493ethannicholas        fsOutName = "sk_FragColor";
129f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
130f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
131f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    for (uint32_t i = 0; i < maxAttribs; i++) {
132f31ae495271e0343f568fb9a1d7e2df81e196896Brian Salomon        oVars[i].setTypeModifier(GrShaderVar::kIn_TypeModifier);
1331edc5b92fecefb79f01cf0e302646eacf32b06c7Brian Salomon        oVars[i].appendDecl(shaderCaps, &fshaderTxt);
134f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        fshaderTxt.append(";\n");
135f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
136f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
137f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    fshaderTxt.appendf(
138f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt            "void main()\n"
139f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt            "{\n"
140f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt               "%s = ", fsOutName);
141f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
142f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    fshaderTxt.appendf("%s", oVars[0].c_str());
143f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    for (uint32_t i = 1; i < maxAttribs; i++) {
144f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        fshaderTxt.appendf(" + %s", oVars[i].c_str());
145f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
146f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
147f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    fshaderTxt.append(";\n"
148f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt                      "}\n");
149f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
1505961bc9278a00e56dacdd9408d0744b5a0a3b493ethannicholas    return CreateProgram(ctx, vshaderTxt.c_str(), fshaderTxt.c_str());
151f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt}
152f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
153f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt///////////////////////////////////////////////////////////////////////////////////////////////////
154f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
155f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittvoid GLVertexAttributesBench::setup(const GrGLContext* ctx) {
156f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    const GrGLInterface* gl = ctx->interface();
15774a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    fTexture = SetupFramebuffer(gl, kScreenWidth, kScreenHeight);
158f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
15974a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    fProgram = setupShader(ctx, fAttribs, kMaxAttribs);
160f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
161f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    // setup matrices
162f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    SkMatrix viewMatrices[kNumTri];
163f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    for (uint32_t i = 0 ; i < kNumTri; i++) {
164f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        SkMatrix m = SkMatrix::I();
165f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        m.setScale(0.0001f, 0.0001f);
166f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        viewMatrices[i] = m;
167f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
168f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
169f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    // presetup vertex attributes, color is set to be a light gray no matter how many vertex
170f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    // attributes are used
171f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    float targetColor = 0.9f;
172f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    float colorContribution = targetColor / fAttribs;
173f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    fVertices.reset(static_cast<int>(kVerticesPerTri * kNumTri * fStride));
174f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    for (uint32_t i = 0; i < kNumTri; i++) {
175f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        unsigned char* ptr = &fVertices[static_cast<int>(i * kVerticesPerTri * fStride)];
176f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        SkPoint* p = reinterpret_cast<SkPoint*>(ptr);
177f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        p->set(-1.0f, -1.0f); p++; p->set( 0.0f, 1.0f);
178f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        p = reinterpret_cast<SkPoint*>(ptr + fStride);
179f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        p->set( 1.0f, -1.0f); p++; p->set( 0.0f, 1.0f);
180f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        p = reinterpret_cast<SkPoint*>(ptr + fStride * 2);
181f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        p->set( 1.0f,  1.0f); p++; p->set( 0.0f, 1.0f);
182f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
183f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        SkPoint* position = reinterpret_cast<SkPoint*>(ptr);
184f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        viewMatrices[i].mapPointsWithStride(position, fStride, kVerticesPerTri);
185f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
186f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        // set colors
187f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        for (uint32_t j = 0; j < kVerticesPerTri; j++) {
188f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt            GrGLfloat* f = reinterpret_cast<GrGLfloat*>(ptr + 2 * sizeof(SkPoint) + fStride * j);
189f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt            for (uint32_t k = 0; k < fAttribs * 4; k += 4) {
190f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt                f[k] = colorContribution;
191f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt                f[k + 1] = colorContribution;
192f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt                f[k + 2] = colorContribution;
193f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt                f[k + 3] = 1.0f;
194f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt            }
195f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        }
196f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
197f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
198f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GR_GL_CALL(gl, GenBuffers(1, &fVBO));
199f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    fBuffers.push_back(fVBO);
200f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
201f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    // clear screen
202f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GR_GL_CALL(gl, ClearColor(0.03f, 0.03f, 0.03f, 1.0f));
203f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GR_GL_CALL(gl, Clear(GR_GL_COLOR_BUFFER_BIT));
204f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
205f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    // set us up to draw
206f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GR_GL_CALL(gl, UseProgram(fProgram));
207f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt}
208f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
209a1ebeb25e9acfcd801e089e063311d716b83b8a5mtkleinvoid GLVertexAttributesBench::glDraw(int loops, const GrGLContext* ctx) {
210f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    const GrGLInterface* gl = ctx->interface();
211f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
212f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    // upload vertex attributes
213f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GR_GL_CALL(gl, BindBuffer(GR_GL_ARRAY_BUFFER, fVBO));
214f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GR_GL_CALL(gl, EnableVertexAttribArray(0));
215f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GR_GL_CALL(gl, VertexAttribPointer(0, 4, GR_GL_FLOAT, GR_GL_FALSE, (GrGLsizei)fStride,
216f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt                                       (GrGLvoid*)0));
217f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
218f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    size_t runningStride = 2 * sizeof(SkPoint);
219f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    for (uint32_t i = 0; i < fAttribs; i++) {
220f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        int attribId = i + 1;
221f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        GR_GL_CALL(gl, EnableVertexAttribArray(attribId));
222f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        GR_GL_CALL(gl, VertexAttribPointer(attribId, 4, GR_GL_FLOAT, GR_GL_FALSE,
223f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt                                           (GrGLsizei)fStride, (GrGLvoid*)(runningStride)));
224f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        runningStride += sizeof(GrGLfloat) * 4;
225f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
226f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
227f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    GR_GL_CALL(gl, BufferData(GR_GL_ARRAY_BUFFER, fVertices.count(), fVertices.begin(),
228f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt                              GR_GL_STREAM_DRAW));
229f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
230f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    uint32_t maxTrianglesPerFlush = kNumTri;
231f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    uint32_t trianglesToDraw = loops * kDrawMultiplier;
232f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
233f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    while (trianglesToDraw > 0) {
234f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        uint32_t triangles = SkTMin(trianglesToDraw, maxTrianglesPerFlush);
235f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        GR_GL_CALL(gl, DrawArrays(GR_GL_TRIANGLES, 0, kVerticesPerTri * triangles));
236f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt        trianglesToDraw -= triangles;
237f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    }
238f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
23974a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt#if 0
240f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    //const char* filename = "/data/local/tmp/out.png";
241f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    SkString filename("out");
242f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt    filename.appendf("_%s.png", this->getName());
24374a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    DumpImage(gl, kScreenWidth, kScreenHeight, filename.c_str());
244f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt#endif
245f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt}
246f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
24774a07db2df189320d4f5804078dc2085b2d38d7cjoshualittvoid GLVertexAttributesBench::teardown(const GrGLInterface* gl) {
24874a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    // teardown
24974a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    GR_GL_CALL(gl, BindBuffer(GR_GL_ARRAY_BUFFER, 0));
25074a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, 0));
25174a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    GR_GL_CALL(gl, BindFramebuffer(GR_GL_FRAMEBUFFER, 0));
25274a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    GR_GL_CALL(gl, DeleteTextures(1, &fTexture));
25374a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    GR_GL_CALL(gl, DeleteProgram(fProgram));
25474a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt    GR_GL_CALL(gl, DeleteBuffers(fBuffers.count(), fBuffers.begin()));
25531b21f67190916b94c5345126ddab327a8feac57joshualitt    fBuffers.reset();
25674a07db2df189320d4f5804078dc2085b2d38d7cjoshualitt}
257f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
258f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt///////////////////////////////////////////////////////////////////////////////
259f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt
260f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittDEF_BENCH( return new GLVertexAttributesBench(0) )
261f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittDEF_BENCH( return new GLVertexAttributesBench(1) )
262f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittDEF_BENCH( return new GLVertexAttributesBench(2) )
263f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittDEF_BENCH( return new GLVertexAttributesBench(3) )
264f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittDEF_BENCH( return new GLVertexAttributesBench(4) )
265f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittDEF_BENCH( return new GLVertexAttributesBench(5) )
266f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittDEF_BENCH( return new GLVertexAttributesBench(6) )
267f06c389f0fe07ce06acd8568d508d6413b8d3728joshualittDEF_BENCH( return new GLVertexAttributesBench(7) )
268f06c389f0fe07ce06acd8568d508d6413b8d3728joshualitt#endif
269