| Index: bench/GLVec4ScalarBench.cpp
|
| diff --git a/bench/GLVec4ScalarBench.cpp b/bench/GLVec4ScalarBench.cpp
|
| deleted file mode 100644
|
| index 1ba8855862c92a55d7ed8f6212f47a34bf126c17..0000000000000000000000000000000000000000
|
| --- a/bench/GLVec4ScalarBench.cpp
|
| +++ /dev/null
|
| @@ -1,311 +0,0 @@
|
| -/*
|
| - * Copyright 2015 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -#include "SkMatrix.h"
|
| -#include "SkPoint.h"
|
| -#include "SkString.h"
|
| -
|
| -#if SK_SUPPORT_GPU
|
| -#include "GLBench.h"
|
| -#include "gl/GrGLGLSL.h"
|
| -#include "gl/GrGLInterface.h"
|
| -#include "gl/GrGLShaderVar.h"
|
| -#include "gl/GrGLUtil.h"
|
| -#include "glsl/GrGLSLCaps.h"
|
| -
|
| -#include <stdio.h>
|
| -
|
| -/**
|
| - * This is a GL benchmark for comparing the performance of using vec4 or float for coverage in GLSL.
|
| - * The generated shader code from this bench will draw several overlapping circles, one in each
|
| - * stage, to simulate coverage calculations. The number of circles (i.e. the number of stages) can
|
| - * be set as a parameter.
|
| - */
|
| -
|
| -class GLVec4ScalarBench : public GLBench {
|
| -public:
|
| - /*
|
| - * Use float or vec4 as GLSL data type for the output coverage
|
| - */
|
| - enum CoverageSetup {
|
| - kUseScalar_CoverageSetup,
|
| - kUseVec4_CoverageSetup,
|
| - };
|
| -
|
| - /*
|
| - * numStages determines the number of shader stages before the XP,
|
| - * which consequently determines how many circles are drawn
|
| - */
|
| - GLVec4ScalarBench(CoverageSetup coverageSetup, uint32_t numStages)
|
| - : fCoverageSetup(coverageSetup)
|
| - , fNumStages(numStages)
|
| - , fVboId(0)
|
| - , fProgram(0)
|
| - , fVaoId(0) {
|
| - fName = NumStagesSetupToStr(coverageSetup, numStages);
|
| - }
|
| -
|
| -protected:
|
| - const char* onGetName() override {
|
| - return fName.c_str();
|
| - }
|
| -
|
| - void setup(const GrGLContext*) override;
|
| - void glDraw(const int loops, const GrGLContext*) override;
|
| - void teardown(const GrGLInterface*) override;
|
| -
|
| -private:
|
| - void setupSingleVbo(const GrGLInterface*, const SkMatrix*);
|
| - GrGLuint setupShader(const GrGLContext*);
|
| -
|
| -
|
| - static SkString NumStagesSetupToStr(CoverageSetup coverageSetup, uint32_t numStages) {
|
| - SkString name("GLVec4ScalarBench");
|
| - switch (coverageSetup) {
|
| - default:
|
| - case kUseScalar_CoverageSetup:
|
| - name.appendf("_scalar_%u_stage", numStages);
|
| - break;
|
| - case kUseVec4_CoverageSetup:
|
| - name.appendf("_vec4_%u_stage", numStages);
|
| - break;
|
| - }
|
| - return name;
|
| - }
|
| -
|
| - static const GrGLuint kScreenWidth = 800;
|
| - static const GrGLuint kScreenHeight = 600;
|
| - static const uint32_t kNumTriPerDraw = 512;
|
| - static const uint32_t kVerticesPerTri = 3;
|
| -
|
| - SkString fName;
|
| - CoverageSetup fCoverageSetup;
|
| - uint32_t fNumStages;
|
| - GrGLuint fVboId;
|
| - GrGLuint fProgram;
|
| - GrGLuint fVaoId;
|
| - GrGLuint fFboTextureId;
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -GrGLuint GLVec4ScalarBench::setupShader(const GrGLContext* ctx) {
|
| - const char* version = GrGLGetGLSLVersionDecl(*ctx);
|
| -
|
| - // this shader draws fNumStages overlapping circles of increasing opacity (coverage) and
|
| - // decreasing size, with the center of each subsequent circle closer to the bottom-right
|
| - // corner of the screen than the previous circle.
|
| -
|
| - // set up vertex shader; this is a trivial vertex shader that passes through position and color
|
| - GrGLShaderVar aPosition("a_position", kVec2f_GrSLType, GrShaderVar::kAttribute_TypeModifier);
|
| - GrGLShaderVar oPosition("o_position", kVec2f_GrSLType, GrShaderVar::kVaryingOut_TypeModifier);
|
| - GrGLShaderVar aColor("a_color", kVec3f_GrSLType, GrShaderVar::kAttribute_TypeModifier);
|
| - GrGLShaderVar oColor("o_color", kVec3f_GrSLType, GrShaderVar::kVaryingOut_TypeModifier);
|
| -
|
| - SkString vshaderTxt(version);
|
| - aPosition.appendDecl(*ctx, &vshaderTxt);
|
| - vshaderTxt.append(";\n");
|
| - aColor.appendDecl(*ctx, &vshaderTxt);
|
| - vshaderTxt.append(";\n");
|
| - oPosition.appendDecl(*ctx, &vshaderTxt);
|
| - vshaderTxt.append(";\n");
|
| - oColor.appendDecl(*ctx, &vshaderTxt);
|
| - vshaderTxt.append(";\n");
|
| -
|
| - vshaderTxt.append(
|
| - "void main()\n"
|
| - "{\n"
|
| - " gl_Position = vec4(a_position, 0.0, 1.0);\n"
|
| - " o_position = a_position;\n"
|
| - " o_color = a_color;\n"
|
| - "}\n");
|
| -
|
| - const GrGLInterface* gl = ctx->interface();
|
| -
|
| - // set up fragment shader; this fragment shader will have fNumStages coverage stages plus an
|
| - // XP stage at the end. Each coverage stage computes the pixel's distance from some hard-
|
| - // coded center and compare that to some hard-coded circle radius to compute a coverage.
|
| - // Then, this coverage is mixed with the coverage from the previous stage and passed to the
|
| - // next stage.
|
| - GrGLShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, GrShaderVar::kOut_TypeModifier);
|
| - SkString fshaderTxt(version);
|
| - GrGLAppendGLSLDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, gl->fStandard,
|
| - &fshaderTxt);
|
| - oPosition.setTypeModifier(GrShaderVar::kVaryingIn_TypeModifier);
|
| - oPosition.appendDecl(*ctx, &fshaderTxt);
|
| - fshaderTxt.append(";\n");
|
| - oColor.setTypeModifier(GrShaderVar::kVaryingIn_TypeModifier);
|
| - oColor.appendDecl(*ctx, &fshaderTxt);
|
| - fshaderTxt.append(";\n");
|
| -
|
| - const char* fsOutName;
|
| - if (ctx->caps()->glslCaps()->mustDeclareFragmentShaderOutput()) {
|
| - oFragColor.appendDecl(*ctx, &fshaderTxt);
|
| - fshaderTxt.append(";\n");
|
| - fsOutName = oFragColor.c_str();
|
| - } else {
|
| - fsOutName = "gl_FragColor";
|
| - }
|
| -
|
| -
|
| - fshaderTxt.appendf(
|
| - "void main()\n"
|
| - "{\n"
|
| - " vec4 outputColor;\n"
|
| - " %s outputCoverage;\n"
|
| - " outputColor = vec4(%s, 1.0);\n"
|
| - " outputCoverage = %s;\n",
|
| - fCoverageSetup == kUseVec4_CoverageSetup ? "vec4" : "float",
|
| - oColor.getName().c_str(),
|
| - fCoverageSetup == kUseVec4_CoverageSetup ? "vec4(1.0)" : "1.0"
|
| - );
|
| -
|
| - float radius = 1.0f;
|
| - for (uint32_t i = 0; i < fNumStages; i++) {
|
| - float centerX = 1.0f - radius;
|
| - float centerY = 1.0f - radius;
|
| - fshaderTxt.appendf(
|
| - " {\n"
|
| - " float d = length(%s - vec2(%f, %f));\n"
|
| - " float edgeAlpha = clamp(100.0 * (%f - d), 0.0, 1.0);\n"
|
| - " outputCoverage = 0.5 * outputCoverage + 0.5 * %s;\n"
|
| - " }\n",
|
| - oPosition.getName().c_str(), centerX, centerY,
|
| - radius,
|
| - fCoverageSetup == kUseVec4_CoverageSetup ? "vec4(edgeAlpha)" : "edgeAlpha"
|
| - );
|
| - radius *= 0.8f;
|
| - }
|
| - fshaderTxt.appendf(
|
| - " {\n"
|
| - " %s = outputColor * outputCoverage;\n"
|
| - " }\n"
|
| - "}\n",
|
| - fsOutName);
|
| -
|
| - return CreateProgram(gl, vshaderTxt.c_str(), fshaderTxt.c_str());
|
| -}
|
| -
|
| -template<typename Func>
|
| -static void setup_matrices(int numQuads, Func f) {
|
| - // We draw a really small triangle so we are not fill rate limited
|
| - for (int i = 0 ; i < numQuads; i++) {
|
| - SkMatrix m = SkMatrix::I();
|
| - m.setScale(0.01f, 0.01f);
|
| - f(m);
|
| - }
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -struct Vertex {
|
| - SkPoint fPositions;
|
| - GrGLfloat fColors[3];
|
| -};
|
| -
|
| -void GLVec4ScalarBench::setupSingleVbo(const GrGLInterface* gl, const SkMatrix* viewMatrices) {
|
| - // triangles drawn will alternate between the top-right half of the screen and the bottom-left
|
| - // half of the screen
|
| - Vertex vertices[kVerticesPerTri * kNumTriPerDraw];
|
| - for (uint32_t i = 0; i < kNumTriPerDraw; i++) {
|
| - Vertex* v = &vertices[i * kVerticesPerTri];
|
| - if (i % 2 == 0) {
|
| - v[0].fPositions.set(-1.0f, -1.0f);
|
| - v[1].fPositions.set( 1.0f, -1.0f);
|
| - v[2].fPositions.set( 1.0f, 1.0f);
|
| - } else {
|
| - v[0].fPositions.set(-1.0f, -1.0f);
|
| - v[1].fPositions.set( 1.0f, 1.0f);
|
| - v[2].fPositions.set( -1.0f, 1.0f);
|
| - }
|
| - SkPoint* position = reinterpret_cast<SkPoint*>(v);
|
| - viewMatrices[i].mapPointsWithStride(position, sizeof(Vertex), kVerticesPerTri);
|
| -
|
| - GrGLfloat color[3] = {1.0f, 0.0f, 1.0f};
|
| - for (uint32_t j = 0; j < kVerticesPerTri; j++) {
|
| - v->fColors[0] = color[0];
|
| - v->fColors[1] = color[1];
|
| - v->fColors[2] = color[2];
|
| - v++;
|
| - }
|
| - }
|
| -
|
| - GR_GL_CALL(gl, GenBuffers(1, &fVboId));
|
| - GR_GL_CALL(gl, BindBuffer(GR_GL_ARRAY_BUFFER, fVboId));
|
| - GR_GL_CALL(gl, EnableVertexAttribArray(0));
|
| - GR_GL_CALL(gl, EnableVertexAttribArray(1));
|
| - GR_GL_CALL(gl, VertexAttribPointer(0, 2, GR_GL_FLOAT, GR_GL_FALSE, sizeof(Vertex),
|
| - (GrGLvoid*)0));
|
| - GR_GL_CALL(gl, VertexAttribPointer(1, 3, GR_GL_FLOAT, GR_GL_FALSE, sizeof(Vertex),
|
| - (GrGLvoid*)(sizeof(SkPoint))));
|
| - GR_GL_CALL(gl, BufferData(GR_GL_ARRAY_BUFFER, sizeof(vertices), vertices, GR_GL_STATIC_DRAW));
|
| -}
|
| -
|
| -void GLVec4ScalarBench::setup(const GrGLContext* ctx) {
|
| - const GrGLInterface* gl = ctx->interface();
|
| - if (!gl) {
|
| - SkFAIL("GL interface is null in setup()\n");
|
| - }
|
| - fFboTextureId = SetupFramebuffer(gl, kScreenWidth, kScreenHeight);
|
| -
|
| - fProgram = this->setupShader(ctx);
|
| -
|
| - GR_GL_CALL(gl, GenVertexArrays(1, &fVaoId));
|
| - GR_GL_CALL(gl, BindVertexArray(fVaoId));
|
| -
|
| - int index = 0;
|
| - SkMatrix viewMatrices[kNumTriPerDraw];
|
| - setup_matrices(kNumTriPerDraw, [&index, &viewMatrices](const SkMatrix& m) {
|
| - viewMatrices[index++] = m;
|
| - });
|
| - this->setupSingleVbo(gl, viewMatrices);
|
| -
|
| - GR_GL_CALL(gl, UseProgram(fProgram));
|
| - GR_GL_CALL(gl, BindVertexArray(fVaoId));
|
| -}
|
| -
|
| -void GLVec4ScalarBench::glDraw(const int loops, const GrGLContext* ctx) {
|
| - const GrGLInterface* gl = ctx->interface();
|
| -
|
| - for (int i = 0; i < loops; i++) {
|
| - GR_GL_CALL(gl, DrawArrays(GR_GL_TRIANGLES, 0, kVerticesPerTri * kNumTriPerDraw));
|
| - }
|
| -
|
| -// using -w when running nanobench will not produce correct images;
|
| -// changing this to #if 1 will write the correct images to the Skia folder.
|
| -#if 0
|
| - SkString filename("out");
|
| - filename.appendf("_%s.png", this->getName());
|
| - DumpImage(gl, kScreenWidth, kScreenHeight, filename.c_str());
|
| -#endif
|
| -}
|
| -
|
| -void GLVec4ScalarBench::teardown(const GrGLInterface* gl) {
|
| - GR_GL_CALL(gl, BindBuffer(GR_GL_ARRAY_BUFFER, 0));
|
| - GR_GL_CALL(gl, BindVertexArray(0));
|
| - GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, 0));
|
| - GR_GL_CALL(gl, BindFramebuffer(GR_GL_FRAMEBUFFER, 0));
|
| - GR_GL_CALL(gl, DeleteTextures(1, &fFboTextureId));
|
| - GR_GL_CALL(gl, DeleteProgram(fProgram));
|
| - GR_GL_CALL(gl, DeleteBuffers(1, &fVboId));
|
| - GR_GL_CALL(gl, DeleteVertexArrays(1, &fVaoId));
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -DEF_BENCH( return new GLVec4ScalarBench(GLVec4ScalarBench::kUseScalar_CoverageSetup, 1) )
|
| -DEF_BENCH( return new GLVec4ScalarBench(GLVec4ScalarBench::kUseVec4_CoverageSetup, 1) )
|
| -DEF_BENCH( return new GLVec4ScalarBench(GLVec4ScalarBench::kUseScalar_CoverageSetup, 2) )
|
| -DEF_BENCH( return new GLVec4ScalarBench(GLVec4ScalarBench::kUseVec4_CoverageSetup, 2) )
|
| -DEF_BENCH( return new GLVec4ScalarBench(GLVec4ScalarBench::kUseScalar_CoverageSetup, 4) )
|
| -DEF_BENCH( return new GLVec4ScalarBench(GLVec4ScalarBench::kUseVec4_CoverageSetup, 4) )
|
| -DEF_BENCH( return new GLVec4ScalarBench(GLVec4ScalarBench::kUseScalar_CoverageSetup, 6) )
|
| -DEF_BENCH( return new GLVec4ScalarBench(GLVec4ScalarBench::kUseVec4_CoverageSetup, 6) )
|
| -DEF_BENCH( return new GLVec4ScalarBench(GLVec4ScalarBench::kUseScalar_CoverageSetup, 8) )
|
| -DEF_BENCH( return new GLVec4ScalarBench(GLVec4ScalarBench::kUseVec4_CoverageSetup, 8) )
|
| -
|
| -#endif
|
|
|