| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "Benchmark.h" | 8 #include "Benchmark.h" |
| 9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
| 10 #include "SkImageEncoder.h" | 10 #include "SkImageEncoder.h" |
| 11 #if SK_SUPPORT_GPU | 11 #if SK_SUPPORT_GPU |
| 12 #include "GrTest.h" | 12 #include "GrTest.h" |
| 13 #include "gl/GrGLGLSL.h" | 13 #include "gl/GrGLGLSL.h" |
| 14 #include "gl/GrGLInterface.h" | 14 #include "gl/GrGLInterface.h" |
| 15 #include "gl/GrGLShaderVar.h" | 15 #include "gl/GrGLShaderVar.h" |
| 16 #include "gl/GrGLUtil.h" | 16 #include "gl/GrGLUtil.h" |
| 17 #include "glsl/GrGLSLCaps.h" | 17 #include "glsl/GrGLSLCaps.h" |
| 18 #include <stdio.h> | 18 #include <stdio.h> |
| 19 | 19 |
| 20 /* | 20 /* |
| 21 * This is a native GL benchmark for determining the cost of uploading vertex at
tributes | 21 * This is a native GL benchmark for determining the cost of uploading vertex at
tributes |
| 22 */ | 22 */ |
| 23 class GLVertexAttributesBench : public Benchmark { | 23 class GLVertexAttributesBench : public Benchmark { |
| 24 public: | 24 public: |
| 25 GLVertexAttributesBench(uint32_t attribs) | 25 GLVertexAttributesBench(uint32_t attribs) |
| 26 : fTexture(0) | 26 : fTexture(0) |
| 27 , fBuffers(0) | 27 , fBuffers(0) |
| 28 , fProgram(0) | 28 , fProgram(0) |
| 29 , fVAO(0) | |
| 30 , fVBO(0) | 29 , fVBO(0) |
| 31 , fAttribs(attribs) | 30 , fAttribs(attribs) |
| 32 , fStride(2 * sizeof(SkPoint) + fAttribs * sizeof(GrGLfloat) * 4) { | 31 , fStride(2 * sizeof(SkPoint) + fAttribs * sizeof(GrGLfloat) * 4) { |
| 33 fName.appendf("GLVertexAttributesBench_%d", fAttribs); | 32 fName.appendf("GLVertexAttributesBench_%d", fAttribs); |
| 34 } | 33 } |
| 35 | 34 |
| 36 protected: | 35 protected: |
| 37 const char* onGetName() override { return fName.c_str(); } | 36 const char* onGetName() override { return fName.c_str(); } |
| 38 void onPerCanvasPreDraw(SkCanvas* canvas) override; | 37 void onPerCanvasPreDraw(SkCanvas* canvas) override; |
| 39 void setup(const GrGLContext*); | 38 void setup(const GrGLContext*); |
| 40 void onDraw(const int loops, SkCanvas*) override; | 39 void onDraw(const int loops, SkCanvas*) override; |
| 41 void onPerCanvasPostDraw(SkCanvas* canvas) override; | 40 void onPerCanvasPostDraw(SkCanvas* canvas) override; |
| 42 | 41 |
| 43 static const GrGLuint kScreenWidth = 800; | 42 static const GrGLuint kScreenWidth = 800; |
| 44 static const GrGLuint kScreenHeight = 600; | 43 static const GrGLuint kScreenHeight = 600; |
| 45 static const uint32_t kNumTri = 10000; | 44 static const uint32_t kNumTri = 10000; |
| 46 static const uint32_t kVerticesPerTri = 3; | 45 static const uint32_t kVerticesPerTri = 3; |
| 47 static const uint32_t kDrawMultiplier = 512; | 46 static const uint32_t kDrawMultiplier = 512; |
| 48 static const uint32_t kMaxAttribs = 7; | 47 static const uint32_t kMaxAttribs = 7; |
| 49 | 48 |
| 50 private: | 49 private: |
| 51 GrGLuint fTexture; | 50 GrGLuint fTexture; |
| 52 SkTArray<GrGLuint> fBuffers; | 51 SkTArray<GrGLuint> fBuffers; |
| 53 GrGLuint fProgram; | 52 GrGLuint fProgram; |
| 54 GrGLuint fVAO; | |
| 55 GrGLuint fVBO; | 53 GrGLuint fVBO; |
| 56 SkTArray<unsigned char> fVertices; | 54 SkTArray<unsigned char> fVertices; |
| 57 uint32_t fAttribs; | 55 uint32_t fAttribs; |
| 58 size_t fStride; | 56 size_t fStride; |
| 59 SkString fName; | 57 SkString fName; |
| 60 typedef Benchmark INHERITED; | 58 typedef Benchmark INHERITED; |
| 61 }; | 59 }; |
| 62 | 60 |
| 63 static const GrGLContext* get_gl_context(SkCanvas* canvas) { | 61 static const GrGLContext* get_gl_context(SkCanvas* canvas) { |
| 64 // This bench exclusively tests GL calls directly | 62 // This bench exclusively tests GL calls directly |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 // This bench exclusively tests GL calls directly | 94 // This bench exclusively tests GL calls directly |
| 97 const GrGLContext* ctx = get_gl_context(canvas); | 95 const GrGLContext* ctx = get_gl_context(canvas); |
| 98 if (!ctx) { | 96 if (!ctx) { |
| 99 return; | 97 return; |
| 100 } | 98 } |
| 101 | 99 |
| 102 const GrGLInterface* gl = ctx->interface(); | 100 const GrGLInterface* gl = ctx->interface(); |
| 103 | 101 |
| 104 // teardown | 102 // teardown |
| 105 GR_GL_CALL(gl, BindBuffer(GR_GL_ARRAY_BUFFER, 0)); | 103 GR_GL_CALL(gl, BindBuffer(GR_GL_ARRAY_BUFFER, 0)); |
| 106 GR_GL_CALL(gl, BindVertexArray(0)); | |
| 107 GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, 0)); | 104 GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, 0)); |
| 108 GR_GL_CALL(gl, BindFramebuffer(GR_GL_FRAMEBUFFER, 0)); | 105 GR_GL_CALL(gl, BindFramebuffer(GR_GL_FRAMEBUFFER, 0)); |
| 109 GR_GL_CALL(gl, DeleteTextures(1, &fTexture)); | 106 GR_GL_CALL(gl, DeleteTextures(1, &fTexture)); |
| 110 GR_GL_CALL(gl, DeleteProgram(fProgram)); | 107 GR_GL_CALL(gl, DeleteProgram(fProgram)); |
| 111 GR_GL_CALL(gl, DeleteBuffers(fBuffers.count(), fBuffers.begin())); | 108 GR_GL_CALL(gl, DeleteBuffers(fBuffers.count(), fBuffers.begin())); |
| 112 GR_GL_CALL(gl, DeleteVertexArrays(1, &fVAO)); | |
| 113 } | 109 } |
| 114 | 110 |
| 115 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 111 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 116 | 112 |
| 117 static GrGLuint load_shader(const GrGLInterface* gl, const char* shaderSrc, GrGL
enum type) { | 113 static GrGLuint load_shader(const GrGLInterface* gl, const char* shaderSrc, GrGL
enum type) { |
| 118 GrGLuint shader; | 114 GrGLuint shader; |
| 119 // Create the shader object | 115 // Create the shader object |
| 120 GR_GL_CALL_RET(gl, shader, CreateShader(type)); | 116 GR_GL_CALL_RET(gl, shader, CreateShader(type)); |
| 121 | 117 |
| 122 // Load the shader source | 118 // Load the shader source |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 "void main()\n" | 170 "void main()\n" |
| 175 "{\n" | 171 "{\n" |
| 176 "gl_Position = a_position;\n"); | 172 "gl_Position = a_position;\n"); |
| 177 | 173 |
| 178 for (uint32_t i = 0; i < attribs; i++) { | 174 for (uint32_t i = 0; i < attribs; i++) { |
| 179 vshaderTxt.appendf("%s = %s;\n", oVars[i].c_str(), aVars[i].c_str()); | 175 vshaderTxt.appendf("%s = %s;\n", oVars[i].c_str(), aVars[i].c_str()); |
| 180 } | 176 } |
| 181 | 177 |
| 182 // Passthrough position as a dummy | 178 // Passthrough position as a dummy |
| 183 for (uint32_t i = attribs; i < maxAttribs; i++) { | 179 for (uint32_t i = attribs; i < maxAttribs; i++) { |
| 184 vshaderTxt.appendf("%s = vec4(0.f, 0.f, 0.f, 1.f);\n", oVars[i].c_str())
; | 180 vshaderTxt.appendf("%s = vec4(0, 0, 0, 1);\n", oVars[i].c_str()); |
| 185 } | 181 } |
| 186 | 182 |
| 187 vshaderTxt.append("}\n"); | 183 vshaderTxt.append("}\n"); |
| 188 | 184 |
| 189 const GrGLInterface* gl = ctx->interface(); | 185 const GrGLInterface* gl = ctx->interface(); |
| 190 GrGLuint vertexShader = load_shader(gl, vshaderTxt.c_str(), GR_GL_VERTEX_SHA
DER); | 186 GrGLuint vertexShader = load_shader(gl, vshaderTxt.c_str(), GR_GL_VERTEX_SHA
DER); |
| 191 | 187 |
| 192 // setup fragment shader | 188 // setup fragment shader |
| 193 GrGLShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, GrShaderVar::kOut_T
ypeModifier); | 189 GrGLShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, GrShaderVar::kOut_T
ypeModifier); |
| 194 SkString fshaderTxt(version); | 190 SkString fshaderTxt(version); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 SkDebugf("------ failed to encode %s\n", filename); | 268 SkDebugf("------ failed to encode %s\n", filename); |
| 273 remove(filename); // remove any partial file | 269 remove(filename); // remove any partial file |
| 274 return; | 270 return; |
| 275 } | 271 } |
| 276 } | 272 } |
| 277 #endif | 273 #endif |
| 278 | 274 |
| 279 static void setup_framebuffer(const GrGLInterface* gl, int screenWidth, int scre
enHeight) { | 275 static void setup_framebuffer(const GrGLInterface* gl, int screenWidth, int scre
enHeight) { |
| 280 //Setup framebuffer | 276 //Setup framebuffer |
| 281 GrGLuint texture; | 277 GrGLuint texture; |
| 282 GR_GL_CALL(gl, PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); | |
| 283 GR_GL_CALL(gl, PixelStorei(GR_GL_PACK_ROW_LENGTH, 0)); | |
| 284 GR_GL_CALL(gl, GenTextures(1, &texture)); | 278 GR_GL_CALL(gl, GenTextures(1, &texture)); |
| 285 GR_GL_CALL(gl, ActiveTexture(GR_GL_TEXTURE15)); | 279 GR_GL_CALL(gl, ActiveTexture(GR_GL_TEXTURE15)); |
| 286 GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, texture)); | 280 GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, texture)); |
| 287 GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MAG_FILTER, GR_
GL_NEAREST)); | 281 GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MAG_FILTER, GR_
GL_NEAREST)); |
| 288 GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MIN_FILTER, GR_
GL_NEAREST)); | 282 GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MIN_FILTER, GR_
GL_NEAREST)); |
| 289 GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_S, GR_GL_C
LAMP_TO_EDGE)); | 283 GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_S, GR_GL_C
LAMP_TO_EDGE)); |
| 290 GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_T, GR_GL_C
LAMP_TO_EDGE)); | 284 GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_T, GR_GL_C
LAMP_TO_EDGE)); |
| 291 GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, | 285 GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, |
| 292 0, //level | 286 0, //level |
| 293 GR_GL_RGBA8, //internal format | 287 GR_GL_RGBA, //internal format |
| 294 screenWidth, // width | 288 screenWidth, // width |
| 295 screenHeight, // height | 289 screenHeight, // height |
| 296 0, //border | 290 0, //border |
| 297 GR_GL_RGBA, //format | 291 GR_GL_RGBA, //format |
| 298 GR_GL_UNSIGNED_BYTE, // type | 292 GR_GL_UNSIGNED_BYTE, // type |
| 299 NULL)); | 293 NULL)); |
| 300 | 294 |
| 301 // bind framebuffer | 295 // bind framebuffer |
| 302 GrGLuint framebuffer; | 296 GrGLuint framebuffer; |
| 303 GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, 0)); | 297 GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, 0)); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 320 fProgram = compile_shader(ctx, fAttribs, kMaxAttribs); | 314 fProgram = compile_shader(ctx, fAttribs, kMaxAttribs); |
| 321 | 315 |
| 322 // setup matrices | 316 // setup matrices |
| 323 SkMatrix viewMatrices[kNumTri]; | 317 SkMatrix viewMatrices[kNumTri]; |
| 324 for (uint32_t i = 0 ; i < kNumTri; i++) { | 318 for (uint32_t i = 0 ; i < kNumTri; i++) { |
| 325 SkMatrix m = SkMatrix::I(); | 319 SkMatrix m = SkMatrix::I(); |
| 326 m.setScale(0.0001f, 0.0001f); | 320 m.setScale(0.0001f, 0.0001f); |
| 327 viewMatrices[i] = m; | 321 viewMatrices[i] = m; |
| 328 } | 322 } |
| 329 | 323 |
| 330 // setup VAO | |
| 331 GR_GL_CALL(gl, GenVertexArrays(1, &fVAO)); | |
| 332 GR_GL_CALL(gl, BindVertexArray(fVAO)); | |
| 333 | |
| 334 // presetup vertex attributes, color is set to be a light gray no matter how
many vertex | 324 // presetup vertex attributes, color is set to be a light gray no matter how
many vertex |
| 335 // attributes are used | 325 // attributes are used |
| 336 float targetColor = 0.9f; | 326 float targetColor = 0.9f; |
| 337 float colorContribution = targetColor / fAttribs; | 327 float colorContribution = targetColor / fAttribs; |
| 338 fVertices.reset(static_cast<int>(kVerticesPerTri * kNumTri * fStride)); | 328 fVertices.reset(static_cast<int>(kVerticesPerTri * kNumTri * fStride)); |
| 339 for (uint32_t i = 0; i < kNumTri; i++) { | 329 for (uint32_t i = 0; i < kNumTri; i++) { |
| 340 unsigned char* ptr = &fVertices[static_cast<int>(i * kVerticesPerTri * f
Stride)]; | 330 unsigned char* ptr = &fVertices[static_cast<int>(i * kVerticesPerTri * f
Stride)]; |
| 341 SkPoint* p = reinterpret_cast<SkPoint*>(ptr); | 331 SkPoint* p = reinterpret_cast<SkPoint*>(ptr); |
| 342 p->set(-1.0f, -1.0f); p++; p->set( 0.0f, 1.0f); | 332 p->set(-1.0f, -1.0f); p++; p->set( 0.0f, 1.0f); |
| 343 p = reinterpret_cast<SkPoint*>(ptr + fStride); | 333 p = reinterpret_cast<SkPoint*>(ptr + fStride); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 362 | 352 |
| 363 GR_GL_CALL(gl, GenBuffers(1, &fVBO)); | 353 GR_GL_CALL(gl, GenBuffers(1, &fVBO)); |
| 364 fBuffers.push_back(fVBO); | 354 fBuffers.push_back(fVBO); |
| 365 | 355 |
| 366 // clear screen | 356 // clear screen |
| 367 GR_GL_CALL(gl, ClearColor(0.03f, 0.03f, 0.03f, 1.0f)); | 357 GR_GL_CALL(gl, ClearColor(0.03f, 0.03f, 0.03f, 1.0f)); |
| 368 GR_GL_CALL(gl, Clear(GR_GL_COLOR_BUFFER_BIT)); | 358 GR_GL_CALL(gl, Clear(GR_GL_COLOR_BUFFER_BIT)); |
| 369 | 359 |
| 370 // set us up to draw | 360 // set us up to draw |
| 371 GR_GL_CALL(gl, UseProgram(fProgram)); | 361 GR_GL_CALL(gl, UseProgram(fProgram)); |
| 372 GR_GL_CALL(gl, BindVertexArray(fVAO)); | |
| 373 } | 362 } |
| 374 | 363 |
| 375 void GLVertexAttributesBench::onDraw(const int loops, SkCanvas* canvas) { | 364 void GLVertexAttributesBench::onDraw(const int loops, SkCanvas* canvas) { |
| 376 const GrGLContext* ctx = get_gl_context(canvas); | 365 const GrGLContext* ctx = get_gl_context(canvas); |
| 377 if (!ctx) { | 366 if (!ctx) { |
| 378 return; | 367 return; |
| 379 } | 368 } |
| 380 | 369 |
| 381 const GrGLInterface* gl = ctx->interface(); | 370 const GrGLInterface* gl = ctx->interface(); |
| 382 | 371 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 | 409 |
| 421 DEF_BENCH( return new GLVertexAttributesBench(0) ) | 410 DEF_BENCH( return new GLVertexAttributesBench(0) ) |
| 422 DEF_BENCH( return new GLVertexAttributesBench(1) ) | 411 DEF_BENCH( return new GLVertexAttributesBench(1) ) |
| 423 DEF_BENCH( return new GLVertexAttributesBench(2) ) | 412 DEF_BENCH( return new GLVertexAttributesBench(2) ) |
| 424 DEF_BENCH( return new GLVertexAttributesBench(3) ) | 413 DEF_BENCH( return new GLVertexAttributesBench(3) ) |
| 425 DEF_BENCH( return new GLVertexAttributesBench(4) ) | 414 DEF_BENCH( return new GLVertexAttributesBench(4) ) |
| 426 DEF_BENCH( return new GLVertexAttributesBench(5) ) | 415 DEF_BENCH( return new GLVertexAttributesBench(5) ) |
| 427 DEF_BENCH( return new GLVertexAttributesBench(6) ) | 416 DEF_BENCH( return new GLVertexAttributesBench(6) ) |
| 428 DEF_BENCH( return new GLVertexAttributesBench(7) ) | 417 DEF_BENCH( return new GLVertexAttributesBench(7) ) |
| 429 #endif | 418 #endif |
| OLD | NEW |