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