| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 | 8 |
| 9 #include "gl/GrGLInterface.h" | 9 #include "gl/GrGLInterface.h" |
| 10 #include "GrGLTestInterface.h" | 10 #include "GrGLTestInterface.h" |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 // Index of the first entry of fBuffers in the free list. Free slots in fBuf
fers are indices to | 106 // Index of the first entry of fBuffers in the free list. Free slots in fBuf
fers are indices to |
| 107 // the next free slot. The last free slot has a value of kFreeListEnd. | 107 // the next free slot. The last free slot has a value of kFreeListEnd. |
| 108 intptr_t fFreeListHead; | 108 intptr_t fFreeListHead; |
| 109 SkTDArray<BufferObj*> fBuffers; | 109 SkTDArray<BufferObj*> fBuffers; |
| 110 }; | 110 }; |
| 111 | 111 |
| 112 /** Null interface implementation */ | 112 /** Null interface implementation */ |
| 113 class NullInterface : public GrGLTestInterface { | 113 class NullInterface : public GrGLTestInterface { |
| 114 public: | 114 public: |
| 115 NullInterface(bool enableNVPR) | 115 NullInterface(bool enableNVPR) |
| 116 : fCurrArrayBuffer(0) | 116 : fCurrProgramID(0) |
| 117 , fCurrElementArrayBuffer(0) | |
| 118 , fCurrPixelPackBuffer(0) | |
| 119 , fCurrPixelUnpackBuffer(0) | |
| 120 , fCurrProgramID(0) | |
| 121 , fCurrShaderID(0) | 117 , fCurrShaderID(0) |
| 122 , fCurrGenericID(0) | 118 , fCurrGenericID(0) |
| 123 , fCurrUniformLocation(0) | 119 , fCurrUniformLocation(0) |
| 124 , fCurrPathID(0) { | 120 , fCurrPathID(0) { |
| 121 memset(fBoundBuffers, 0, sizeof(fBoundBuffers)); |
| 125 fExtensions.push_back("GL_ARB_framebuffer_object"); | 122 fExtensions.push_back("GL_ARB_framebuffer_object"); |
| 126 fExtensions.push_back("GL_ARB_blend_func_extended"); | 123 fExtensions.push_back("GL_ARB_blend_func_extended"); |
| 127 fExtensions.push_back("GL_ARB_timer_query"); | 124 fExtensions.push_back("GL_ARB_timer_query"); |
| 128 fExtensions.push_back("GL_ARB_draw_buffers"); | 125 fExtensions.push_back("GL_ARB_draw_buffers"); |
| 129 fExtensions.push_back("GL_ARB_occlusion_query"); | 126 fExtensions.push_back("GL_ARB_occlusion_query"); |
| 130 fExtensions.push_back("GL_EXT_stencil_wrap"); | 127 fExtensions.push_back("GL_EXT_stencil_wrap"); |
| 131 if (enableNVPR) { | 128 if (enableNVPR) { |
| 132 fExtensions.push_back("GL_NV_path_rendering"); | 129 fExtensions.push_back("GL_NV_path_rendering"); |
| 133 fExtensions.push_back("GL_ARB_program_interface_query"); | 130 fExtensions.push_back("GL_ARB_program_interface_query"); |
| 134 } | 131 } |
| 135 fExtensions.push_back(nullptr); | 132 fExtensions.push_back(nullptr); |
| 136 | 133 |
| 137 this->init(kGL_GrGLStandard); | 134 this->init(kGL_GrGLStandard); |
| 138 } | 135 } |
| 139 | 136 |
| 140 GrGLenum checkFramebufferStatus(GrGLenum target) override { | 137 GrGLenum checkFramebufferStatus(GrGLenum target) override { |
| 141 return GR_GL_FRAMEBUFFER_COMPLETE; | 138 return GR_GL_FRAMEBUFFER_COMPLETE; |
| 142 } | 139 } |
| 143 | 140 |
| 144 GrGLvoid genBuffers(GrGLsizei n, GrGLuint* ids) override { | 141 GrGLvoid genBuffers(GrGLsizei n, GrGLuint* ids) override { |
| 145 for (int i = 0; i < n; ++i) { | 142 for (int i = 0; i < n; ++i) { |
| 146 BufferObj* buffer = fBufferManager.create(); | 143 BufferObj* buffer = fBufferManager.create(); |
| 147 ids[i] = buffer->id(); | 144 ids[i] = buffer->id(); |
| 148 } | 145 } |
| 149 } | 146 } |
| 150 | 147 |
| 151 GrGLvoid bufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data
, | 148 GrGLvoid bufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data
, |
| 152 GrGLenum usage) override { | 149 GrGLenum usage) override { |
| 153 GrGLuint id = 0; | 150 GrGLuint id = fBoundBuffers[GetBufferIndex(target)]; |
| 154 | |
| 155 switch (target) { | |
| 156 case GR_GL_ARRAY_BUFFER: | |
| 157 id = fCurrArrayBuffer; | |
| 158 break; | |
| 159 case GR_GL_ELEMENT_ARRAY_BUFFER: | |
| 160 id = fCurrElementArrayBuffer; | |
| 161 break; | |
| 162 case GR_GL_PIXEL_PACK_BUFFER: | |
| 163 id = fCurrPixelPackBuffer; | |
| 164 break; | |
| 165 case GR_GL_PIXEL_UNPACK_BUFFER: | |
| 166 id = fCurrPixelUnpackBuffer; | |
| 167 break; | |
| 168 default: | |
| 169 SkFAIL("Unexpected target to nullGLBufferData"); | |
| 170 break; | |
| 171 } | |
| 172 | |
| 173 if (id > 0) { | 151 if (id > 0) { |
| 174 BufferObj* buffer = fBufferManager.lookUp(id); | 152 BufferObj* buffer = fBufferManager.lookUp(id); |
| 175 buffer->allocate(size, (const GrGLchar*) data); | 153 buffer->allocate(size, (const GrGLchar*) data); |
| 176 } | 154 } |
| 177 } | 155 } |
| 178 | 156 |
| 179 GrGLuint createProgram() override { | 157 GrGLuint createProgram() override { |
| 180 return ++fCurrProgramID; | 158 return ++fCurrProgramID; |
| 181 } | 159 } |
| 182 | 160 |
| 183 GrGLuint createShader(GrGLenum type) override { | 161 GrGLuint createShader(GrGLenum type) override { |
| 184 return ++fCurrShaderID; | 162 return ++fCurrShaderID; |
| 185 } | 163 } |
| 186 | 164 |
| 187 GrGLvoid bindBuffer(GrGLenum target, GrGLuint buffer) override { | 165 GrGLvoid bindBuffer(GrGLenum target, GrGLuint buffer) override { |
| 188 switch (target) { | 166 fBoundBuffers[GetBufferIndex(target)] = buffer; |
| 189 case GR_GL_ARRAY_BUFFER: | |
| 190 fCurrArrayBuffer = buffer; | |
| 191 break; | |
| 192 case GR_GL_ELEMENT_ARRAY_BUFFER: | |
| 193 fCurrElementArrayBuffer = buffer; | |
| 194 break; | |
| 195 case GR_GL_PIXEL_PACK_BUFFER: | |
| 196 fCurrPixelPackBuffer = buffer; | |
| 197 break; | |
| 198 case GR_GL_PIXEL_UNPACK_BUFFER: | |
| 199 fCurrPixelUnpackBuffer = buffer; | |
| 200 break; | |
| 201 } | |
| 202 } | 167 } |
| 203 | 168 |
| 204 // deleting a bound buffer has the side effect of binding 0 | 169 // deleting a bound buffer has the side effect of binding 0 |
| 205 GrGLvoid deleteBuffers(GrGLsizei n, const GrGLuint* ids) override { | 170 GrGLvoid deleteBuffers(GrGLsizei n, const GrGLuint* ids) override { |
| 171 // First potentially unbind the buffers. |
| 172 for (int buffIdx = 0; buffIdx < kNumBufferTargets; ++buffIdx) { |
| 173 if (!fBoundBuffers[buffIdx]) { |
| 174 continue; |
| 175 } |
| 176 for (int i = 0; i < n; ++i) { |
| 177 if (ids[i] == fBoundBuffers[buffIdx]) { |
| 178 fBoundBuffers[buffIdx] = 0; |
| 179 break; |
| 180 } |
| 181 } |
| 182 } |
| 183 |
| 184 // Then actually "delete" the buffers. |
| 206 for (int i = 0; i < n; ++i) { | 185 for (int i = 0; i < n; ++i) { |
| 207 if (ids[i] == fCurrArrayBuffer) { | |
| 208 fCurrArrayBuffer = 0; | |
| 209 } | |
| 210 if (ids[i] == fCurrElementArrayBuffer) { | |
| 211 fCurrElementArrayBuffer = 0; | |
| 212 } | |
| 213 if (ids[i] == fCurrPixelPackBuffer) { | |
| 214 fCurrPixelPackBuffer = 0; | |
| 215 } | |
| 216 if (ids[i] == fCurrPixelUnpackBuffer) { | |
| 217 fCurrPixelUnpackBuffer = 0; | |
| 218 } | |
| 219 | |
| 220 if (ids[i] > 0) { | 186 if (ids[i] > 0) { |
| 221 BufferObj* buffer = fBufferManager.lookUp(ids[i]); | 187 BufferObj* buffer = fBufferManager.lookUp(ids[i]); |
| 222 fBufferManager.free(buffer); | 188 fBufferManager.free(buffer); |
| 223 } | 189 } |
| 224 } | 190 } |
| 225 } | 191 } |
| 226 | 192 |
| 227 GrGLvoid genFramebuffers(GrGLsizei n, GrGLuint *framebuffers) override { | 193 GrGLvoid genFramebuffers(GrGLsizei n, GrGLuint *framebuffers) override { |
| 228 this->genGenericIds(n, framebuffers); | 194 this->genGenericIds(n, framebuffers); |
| 229 } | 195 } |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 return nullptr; | 366 return nullptr; |
| 401 } | 367 } |
| 402 } | 368 } |
| 403 | 369 |
| 404 GrGLint getUniformLocation(GrGLuint program, const char* name) override { | 370 GrGLint getUniformLocation(GrGLuint program, const char* name) override { |
| 405 return ++fCurrUniformLocation; | 371 return ++fCurrUniformLocation; |
| 406 } | 372 } |
| 407 | 373 |
| 408 GrGLvoid* mapBufferRange(GrGLenum target, GrGLintptr offset, GrGLsizeiptr le
ngth, | 374 GrGLvoid* mapBufferRange(GrGLenum target, GrGLintptr offset, GrGLsizeiptr le
ngth, |
| 409 GrGLbitfield access) override { | 375 GrGLbitfield access) override { |
| 410 GrGLuint id = 0; | 376 GrGLuint id = fBoundBuffers[GetBufferIndex(target)]; |
| 411 switch (target) { | |
| 412 case GR_GL_ARRAY_BUFFER: | |
| 413 id = fCurrArrayBuffer; | |
| 414 break; | |
| 415 case GR_GL_ELEMENT_ARRAY_BUFFER: | |
| 416 id = fCurrElementArrayBuffer; | |
| 417 break; | |
| 418 case GR_GL_PIXEL_PACK_BUFFER: | |
| 419 id = fCurrPixelPackBuffer; | |
| 420 break; | |
| 421 case GR_GL_PIXEL_UNPACK_BUFFER: | |
| 422 id = fCurrPixelUnpackBuffer; | |
| 423 break; | |
| 424 } | |
| 425 | |
| 426 if (id > 0) { | 377 if (id > 0) { |
| 427 // We just ignore the offset and length here. | 378 // We just ignore the offset and length here. |
| 428 BufferObj* buffer = fBufferManager.lookUp(id); | 379 BufferObj* buffer = fBufferManager.lookUp(id); |
| 429 SkASSERT(!buffer->mapped()); | 380 SkASSERT(!buffer->mapped()); |
| 430 buffer->setMapped(true); | 381 buffer->setMapped(true); |
| 431 return buffer->dataPtr(); | 382 return buffer->dataPtr(); |
| 432 } | 383 } |
| 433 return nullptr; | 384 return nullptr; |
| 434 } | 385 } |
| 435 | 386 |
| 436 GrGLvoid* mapBuffer(GrGLenum target, GrGLenum access) override { | 387 GrGLvoid* mapBuffer(GrGLenum target, GrGLenum access) override { |
| 437 GrGLuint id = 0; | 388 GrGLuint id = fBoundBuffers[GetBufferIndex(target)]; |
| 438 switch (target) { | |
| 439 case GR_GL_ARRAY_BUFFER: | |
| 440 id = fCurrArrayBuffer; | |
| 441 break; | |
| 442 case GR_GL_ELEMENT_ARRAY_BUFFER: | |
| 443 id = fCurrElementArrayBuffer; | |
| 444 break; | |
| 445 case GR_GL_PIXEL_PACK_BUFFER: | |
| 446 id = fCurrPixelPackBuffer; | |
| 447 break; | |
| 448 case GR_GL_PIXEL_UNPACK_BUFFER: | |
| 449 id = fCurrPixelUnpackBuffer; | |
| 450 break; | |
| 451 } | |
| 452 | |
| 453 if (id > 0) { | 389 if (id > 0) { |
| 454 BufferObj* buffer = fBufferManager.lookUp(id); | 390 BufferObj* buffer = fBufferManager.lookUp(id); |
| 455 SkASSERT(!buffer->mapped()); | 391 SkASSERT(!buffer->mapped()); |
| 456 buffer->setMapped(true); | 392 buffer->setMapped(true); |
| 457 return buffer->dataPtr(); | 393 return buffer->dataPtr(); |
| 458 } | 394 } |
| 459 | 395 |
| 460 SkASSERT(false); | 396 SkASSERT(false); |
| 461 return nullptr; // no buffer bound to target | 397 return nullptr; // no buffer bound to target |
| 462 } | 398 } |
| 463 | 399 |
| 464 GrGLboolean unmapBuffer(GrGLenum target) override { | 400 GrGLboolean unmapBuffer(GrGLenum target) override { |
| 465 GrGLuint id = 0; | 401 GrGLuint id = fBoundBuffers[GetBufferIndex(target)]; |
| 466 switch (target) { | |
| 467 case GR_GL_ARRAY_BUFFER: | |
| 468 id = fCurrArrayBuffer; | |
| 469 break; | |
| 470 case GR_GL_ELEMENT_ARRAY_BUFFER: | |
| 471 id = fCurrElementArrayBuffer; | |
| 472 break; | |
| 473 case GR_GL_PIXEL_PACK_BUFFER: | |
| 474 id = fCurrPixelPackBuffer; | |
| 475 break; | |
| 476 case GR_GL_PIXEL_UNPACK_BUFFER: | |
| 477 id = fCurrPixelUnpackBuffer; | |
| 478 break; | |
| 479 } | |
| 480 if (id > 0) { | 402 if (id > 0) { |
| 481 BufferObj* buffer = fBufferManager.lookUp(id); | 403 BufferObj* buffer = fBufferManager.lookUp(id); |
| 482 SkASSERT(buffer->mapped()); | 404 SkASSERT(buffer->mapped()); |
| 483 buffer->setMapped(false); | 405 buffer->setMapped(false); |
| 484 return GR_GL_TRUE; | 406 return GR_GL_TRUE; |
| 485 } | 407 } |
| 486 | 408 |
| 487 GrAlwaysAssert(false); | 409 GrAlwaysAssert(false); |
| 488 return GR_GL_FALSE; // GR_GL_INVALID_OPERATION; | 410 return GR_GL_FALSE; // GR_GL_INVALID_OPERATION; |
| 489 } | 411 } |
| 490 | 412 |
| 491 GrGLvoid getBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* para
ms) override { | 413 GrGLvoid getBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* para
ms) override { |
| 492 switch (pname) { | 414 switch (pname) { |
| 493 case GR_GL_BUFFER_MAPPED: { | 415 case GR_GL_BUFFER_MAPPED: { |
| 494 *params = GR_GL_FALSE; | 416 *params = GR_GL_FALSE; |
| 495 GrGLuint id = 0; | 417 GrGLuint id = fBoundBuffers[GetBufferIndex(target)]; |
| 496 switch (target) { | |
| 497 case GR_GL_ARRAY_BUFFER: | |
| 498 id = fCurrArrayBuffer; | |
| 499 break; | |
| 500 case GR_GL_ELEMENT_ARRAY_BUFFER: | |
| 501 id = fCurrElementArrayBuffer; | |
| 502 break; | |
| 503 case GR_GL_PIXEL_PACK_BUFFER: | |
| 504 id = fCurrPixelPackBuffer; | |
| 505 break; | |
| 506 case GR_GL_PIXEL_UNPACK_BUFFER: | |
| 507 id = fCurrPixelUnpackBuffer; | |
| 508 break; | |
| 509 } | |
| 510 if (id > 0) { | 418 if (id > 0) { |
| 511 BufferObj* buffer = fBufferManager.lookUp(id); | 419 BufferObj* buffer = fBufferManager.lookUp(id); |
| 512 if (buffer->mapped()) { | 420 if (buffer->mapped()) { |
| 513 *params = GR_GL_TRUE; | 421 *params = GR_GL_TRUE; |
| 514 } | 422 } |
| 515 } | 423 } |
| 516 break; } | 424 break; } |
| 517 default: | 425 default: |
| 518 SkFAIL("Unexpected pname to GetBufferParamateriv"); | 426 SkFAIL("Unexpected pname to GetBufferParamateriv"); |
| 519 break; | 427 break; |
| 520 } | 428 } |
| 521 }; | 429 }; |
| 522 | 430 |
| 523 // NV_path_rendering | 431 // NV_path_rendering |
| 524 GrGLuint genPaths(GrGLsizei range) override { | 432 GrGLuint genPaths(GrGLsizei range) override { |
| 525 return ++fCurrPathID; | 433 return ++fCurrPathID; |
| 526 } | 434 } |
| 527 | 435 |
| 528 | 436 |
| 529 private: | 437 private: |
| 438 inline int static GetBufferIndex(GrGLenum glTarget) { |
| 439 switch (glTarget) { |
| 440 default: SkFAIL("Unexpected GL target to G
etBufferIndex"); |
| 441 case GR_GL_ARRAY_BUFFER: return 0; |
| 442 case GR_GL_ELEMENT_ARRAY_BUFFER: return 1; |
| 443 case GR_GL_TEXTURE_BUFFER: return 2; |
| 444 case GR_GL_DRAW_INDIRECT_BUFFER: return 3; |
| 445 case GR_GL_PIXEL_PACK_BUFFER: return 4; |
| 446 case GR_GL_PIXEL_UNPACK_BUFFER: return 5; |
| 447 } |
| 448 } |
| 449 constexpr int static kNumBufferTargets = 6; |
| 450 |
| 530 BufferManager fBufferManager; | 451 BufferManager fBufferManager; |
| 531 GrGLuint fCurrArrayBuffer; | 452 GrGLuint fBoundBuffers[kNumBufferTargets]; |
| 532 GrGLuint fCurrElementArrayBuffer; | |
| 533 GrGLuint fCurrPixelPackBuffer; | |
| 534 GrGLuint fCurrPixelUnpackBuffer; | |
| 535 GrGLuint fCurrProgramID; | 453 GrGLuint fCurrProgramID; |
| 536 GrGLuint fCurrShaderID; | 454 GrGLuint fCurrShaderID; |
| 537 GrGLuint fCurrGenericID; | 455 GrGLuint fCurrGenericID; |
| 538 GrGLuint fCurrUniformLocation; | 456 GrGLuint fCurrUniformLocation; |
| 539 GrGLuint fCurrPathID; | 457 GrGLuint fCurrPathID; |
| 540 SkTArray<const char*> fExtensions; | 458 SkTArray<const char*> fExtensions; |
| 541 | 459 |
| 542 // the OpenGLES 2.0 spec says this must be >= 128 | 460 // the OpenGLES 2.0 spec says this must be >= 128 |
| 543 static const GrGLint kDefaultMaxVertexUniformVectors = 128; | 461 static const GrGLint kDefaultMaxVertexUniformVectors = 128; |
| 544 | 462 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 615 break; | 533 break; |
| 616 } | 534 } |
| 617 } | 535 } |
| 618 | 536 |
| 619 typedef GrGLTestInterface INHERITED; | 537 typedef GrGLTestInterface INHERITED; |
| 620 }; | 538 }; |
| 621 | 539 |
| 622 } // anonymous namespace | 540 } // anonymous namespace |
| 623 | 541 |
| 624 const GrGLInterface* GrGLCreateNullInterface(bool enableNVPR) { return new NullI
nterface(enableNVPR); } | 542 const GrGLInterface* GrGLCreateNullInterface(bool enableNVPR) { return new NullI
nterface(enableNVPR); } |
| OLD | NEW |