13724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 20da3719050473344b6013fd7b614611984f20effrobertphillips@google.com/* 30da3719050473344b6013fd7b614611984f20effrobertphillips@google.com * Copyright 2012 Google Inc. 40da3719050473344b6013fd7b614611984f20effrobertphillips@google.com * 50da3719050473344b6013fd7b614611984f20effrobertphillips@google.com * Use of this source code is governed by a BSD-style license that can be 60da3719050473344b6013fd7b614611984f20effrobertphillips@google.com * found in the LICENSE file. 70da3719050473344b6013fd7b614611984f20effrobertphillips@google.com */ 80da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 9273c0f5e87397c40d22bb7e3ee078bb46a3f6860bsalomon#include "DebugGLTestContext.h" 103c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com#include "GrBufferObj.h" 12dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com#include "GrFrameBufferObj.h" 133c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon#include "GrProgramObj.h" 14dd743fefad9764ad86d7f69deec32e9a3b5de47frobertphillips@google.com#include "GrRenderBufferObj.h" 153c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon#include "GrShaderObj.h" 163c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon#include "GrTextureObj.h" 173c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon#include "GrTextureUnitObj.h" 18ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com#include "GrVertexArrayObj.h" 193c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon#include "gl/GrGLTestInterface.h" 200da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 213c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon#include "SkMutex.h" 22cf6285b89b8820641ffb6871d4b3275bfe783f51caryclark@google.com 233c481001b16288f604a5279bcb4bf46c5dd2b703bsalomonnamespace { 24fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 253c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon// Helper macro to make creating an object (where you need to get back a derived type) easier 263c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon#define CREATE(className, classEnum) \ 273c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon reinterpret_cast<className *>(this->createObj(classEnum)) 280da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 293c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon// Helper macro to make creating an object (where you need to get back a derived type) easier 303c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon#define FIND(id, className, classEnum) \ 313c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon reinterpret_cast<className *>(this->findObject(id, classEnum)) 320da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 333c481001b16288f604a5279bcb4bf46c5dd2b703bsalomonclass DebugInterface : public GrGLTestInterface { 343c481001b16288f604a5279bcb4bf46c5dd2b703bsalomonpublic: 353c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon DebugInterface() 363c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon : fCurrGenericID(0) 373c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon , fCurrTextureUnit(0) 383c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon , fVertexArray(nullptr) 393c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon , fPackRowLength(0) 403c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon , fUnpackRowLength(0) 413c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon , fPackAlignment(4) 423c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon , fFrameBuffer(nullptr) 433c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon , fRenderBuffer(nullptr) 443c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon , fProgram(nullptr) 453c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon , fAbandoned(false) { 463c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon for (int i = 0; i < kDefaultMaxTextureUnits; ++i) { 473c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fTextureUnits[i] = 483c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon reinterpret_cast<GrTextureUnitObj*>(this->createObj(kTextureUnit_ObjTypes)); 493c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fTextureUnits[i]->ref(); 503c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fTextureUnits[i]->setNumber(i); 513c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 529b972c4a1278c16d7237563560710774edb43b3ccsmartdalton memset(fBoundBuffers, 0, sizeof(fBoundBuffers)); 533c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->init(kGL_GrGLStandard); 543c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 55ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 563c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon ~DebugInterface() override { 573c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // unref & delete the texture units first so they don't show up on the leak report 583c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon for (int i = 0; i < kDefaultMaxTextureUnits; ++i) { 593c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fTextureUnits[i]->unref(); 603c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fTextureUnits[i]->deleteAction(); 613c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 623c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon for (int i = 0; i < fObjects.count(); ++i) { 633c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon delete fObjects[i]; 643c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 653c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fObjects.reset(); 660da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 679b972c4a1278c16d7237563560710774edb43b3ccsmartdalton memset(fBoundBuffers, 0, sizeof(fBoundBuffers)); 683c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fVertexArray = nullptr; 690da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 703c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->report(); 713c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 720da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 733c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon void abandon() const override { fAbandoned = true; } 74ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 753c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid activeTexture(GrGLenum texture) override { 763c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // Ganesh offsets the texture unit indices 773c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon texture -= GR_GL_TEXTURE0; 783c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(texture < kDefaultMaxTextureUnits); 793c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fCurrTextureUnit = texture; 803c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 81ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 823c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid attachShader(GrGLuint programID, GrGLuint shaderID) override { 83ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 843c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrProgramObj *program = FIND(programID, GrProgramObj, kProgram_ObjTypes); 853c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(program); 86ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 873c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrShaderObj *shader = FIND(shaderID, GrShaderObj, kShader_ObjTypes); 883c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(shader); 89ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 903c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon program->AttachShader(shader); 913c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 92ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 933c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon //////////////////////////////////////////////////////////////////////////////// 943c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid bindTexture(GrGLenum target, GrGLuint textureID) override { 953c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(target == GR_GL_TEXTURE_2D || 963c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon target == GR_GL_TEXTURE_RECTANGLE || 973c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon target == GR_GL_TEXTURE_EXTERNAL); 980da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 993c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // a textureID of 0 is acceptable - it binds to the default texture target 1003c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrTextureObj *texture = FIND(textureID, GrTextureObj, kTexture_ObjTypes); 1013c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 1023c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->setTexture(texture); 103670ff9ae7f37356bff08b30a356bb0c52dc8d62erobertphillips@google.com } 104670ff9ae7f37356bff08b30a356bb0c52dc8d62erobertphillips@google.com 1053c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon //////////////////////////////////////////////////////////////////////////////// 1063c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid bufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data, 1073c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLenum usage) override { 1083c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(size >= 0); 1093c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(GR_GL_STREAM_DRAW == usage || 1103c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GR_GL_STATIC_DRAW == usage || 1113c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GR_GL_DYNAMIC_DRAW == usage); 1123c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 1139b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrBufferObj *buffer = fBoundBuffers[GetBufferIndex(target)]; 1143c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(buffer); 1153c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(buffer->getBound()); 116670ff9ae7f37356bff08b30a356bb0c52dc8d62erobertphillips@google.com 1173c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon buffer->allocate(size, reinterpret_cast<const GrGLchar *>(data)); 1183c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon buffer->setUsage(usage); 119670ff9ae7f37356bff08b30a356bb0c52dc8d62erobertphillips@google.com } 120670ff9ae7f37356bff08b30a356bb0c52dc8d62erobertphillips@google.com 121670ff9ae7f37356bff08b30a356bb0c52dc8d62erobertphillips@google.com 1223c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid pixelStorei(GrGLenum pname, GrGLint param) override { 1233c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 1243c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon switch (pname) { 1253c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_UNPACK_ROW_LENGTH: 1263c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fUnpackRowLength = param; 1273c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 1283c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_PACK_ROW_LENGTH: 1293c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fPackRowLength = param; 1303c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 1313c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_UNPACK_ALIGNMENT: 1323c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 1333c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_PACK_ALIGNMENT: 1343c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fPackAlignment = param; 1353c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 1363c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon default: 1373c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(false); 1383c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 1393c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 140670ff9ae7f37356bff08b30a356bb0c52dc8d62erobertphillips@google.com } 141f6f123d23608a4a5fe9c812d2452039a18da7e0brobertphillips@google.com 1423c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid readPixels(GrGLint x, 1433c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint y, 1443c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLsizei width, 1453c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLsizei height, 1463c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLenum format, 1473c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLenum type, 1483c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid* pixels) override { 1493c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 1503c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint pixelsInRow = width; 1513c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (fPackRowLength > 0) { 1523c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon pixelsInRow = fPackRowLength; 1533c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 154ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 1553c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint componentsPerPixel = 0; 1563c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 1573c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon switch (format) { 1583c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_RGBA: 1593c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // fallthrough 1603c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_BGRA: 1613c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon componentsPerPixel = 4; 1623c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 1633c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_RGB: 1643c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon componentsPerPixel = 3; 1653c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 1663c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_RED: 1673c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon componentsPerPixel = 1; 1683c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 1693c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon default: 1703c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(false); 1713c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 1723c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 173ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 1743c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint alignment = fPackAlignment; 175ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 1763c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint componentSize = 0; // size (in bytes) of a single component 177ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 1783c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon switch (type) { 1793c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_UNSIGNED_BYTE: 1803c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon componentSize = 1; 1813c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 1823c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon default: 1833c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(false); 1843c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 1853c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 186ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 1873c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint rowStride = 0; // number of components (not bytes) to skip 1883c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (componentSize >= alignment) { 1893c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon rowStride = componentsPerPixel * pixelsInRow; 1903c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } else { 1913c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon float fTemp = 1923c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon sk_float_ceil(componentSize * componentsPerPixel * pixelsInRow / 1933c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon static_cast<float>(alignment)); 1943c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon rowStride = static_cast<GrGLint>(alignment * fTemp / componentSize); 1953c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 196ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 1973c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLchar *scanline = static_cast<GrGLchar *>(pixels); 1983c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon for (int y = 0; y < height; ++y) { 1993c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon memset(scanline, 0, componentsPerPixel * componentSize * width); 2003c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon scanline += rowStride; 2013c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 2023c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 203ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2043724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLvoid useProgram(GrGLuint programID) override { 205ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2063724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // A programID of 0 is legal 2073724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrProgramObj *program = FIND(programID, GrProgramObj, kProgram_ObjTypes); 208ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2093724e574a744491b7cfb8187ac865a70ef3d4528bsalomon this->useProgram(program); 2103724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 2113c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 2123724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLvoid bindFramebuffer(GrGLenum target, GrGLuint frameBufferID) override { 213ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2143724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(GR_GL_FRAMEBUFFER == target || 2153724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GR_GL_READ_FRAMEBUFFER == target || 2163724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GR_GL_DRAW_FRAMEBUFFER); 217ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2183724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // a frameBufferID of 0 is acceptable - it binds to the default 2193724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // frame buffer 2203724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrFrameBufferObj *frameBuffer = FIND(frameBufferID, GrFrameBufferObj, 2213724e574a744491b7cfb8187ac865a70ef3d4528bsalomon kFrameBuffer_ObjTypes); 2223c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 2233724e574a744491b7cfb8187ac865a70ef3d4528bsalomon this->setFrameBuffer(frameBuffer); 2243724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 225ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2263724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLvoid bindRenderbuffer(GrGLenum target, GrGLuint renderBufferID) override { 227ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2283724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(GR_GL_RENDERBUFFER == target); 2293c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 2303724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // a renderBufferID of 0 is acceptable - it unbinds the bound render buffer 2313724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrRenderBufferObj *renderBuffer = FIND(renderBufferID, GrRenderBufferObj, 2323724e574a744491b7cfb8187ac865a70ef3d4528bsalomon kRenderBuffer_ObjTypes); 2333c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 2343724e574a744491b7cfb8187ac865a70ef3d4528bsalomon this->setRenderBuffer(renderBuffer); 2353724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 236ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2373724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLvoid deleteTextures(GrGLsizei n, const GrGLuint* textures) override { 2383724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // first potentially unbind the texture 2393724e574a744491b7cfb8187ac865a70ef3d4528bsalomon for (unsigned int i = 0; i < kDefaultMaxTextureUnits; ++i) { 2403724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrTextureUnitObj *pTU = this->getTextureUnit(i); 2413c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 2423724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (pTU->getTexture()) { 2433724e574a744491b7cfb8187ac865a70ef3d4528bsalomon for (int j = 0; j < n; ++j) { 2443c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 2453724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (textures[j] == pTU->getTexture()->getID()) { 2463724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // this ID is the current texture - revert the binding to 0 2473724e574a744491b7cfb8187ac865a70ef3d4528bsalomon pTU->setTexture(nullptr); 2483724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 2493724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 2503724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 2513724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 252ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2533724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // TODO: fuse the following block with DeleteRenderBuffers? 2543724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // Open GL will remove a deleted render buffer from the active 2553724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // frame buffer but not from any other frame buffer 2563724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (this->getFrameBuffer()) { 257ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2583724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrFrameBufferObj *frameBuffer = this->getFrameBuffer(); 259ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2603724e574a744491b7cfb8187ac865a70ef3d4528bsalomon for (int i = 0; i < n; ++i) { 261ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2623724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (frameBuffer->getColor() && 2633724e574a744491b7cfb8187ac865a70ef3d4528bsalomon textures[i] == frameBuffer->getColor()->getID()) { 2643724e574a744491b7cfb8187ac865a70ef3d4528bsalomon frameBuffer->setColor(nullptr); 2653724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 2663724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (frameBuffer->getDepth() && 2673724e574a744491b7cfb8187ac865a70ef3d4528bsalomon textures[i] == frameBuffer->getDepth()->getID()) { 2683724e574a744491b7cfb8187ac865a70ef3d4528bsalomon frameBuffer->setDepth(nullptr); 2693724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 2703724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (frameBuffer->getStencil() && 2713724e574a744491b7cfb8187ac865a70ef3d4528bsalomon textures[i] == frameBuffer->getStencil()->getID()) { 2723724e574a744491b7cfb8187ac865a70ef3d4528bsalomon frameBuffer->setStencil(nullptr); 2733724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 2743724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 2753724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 276ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2773724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // then actually "delete" the buffers 2783724e574a744491b7cfb8187ac865a70ef3d4528bsalomon for (int i = 0; i < n; ++i) { 2793724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrTextureObj *buffer = FIND(textures[i], GrTextureObj, kTexture_ObjTypes); 2803724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(buffer); 281ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2823724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // OpenGL gives no guarantees if a texture is deleted while attached to 2833724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // something other than the currently bound frame buffer 2843724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(!buffer->getBound()); 2853c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 2863724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(!buffer->getDeleted()); 2873724e574a744491b7cfb8187ac865a70ef3d4528bsalomon buffer->deleteAction(); 2883724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 289ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2903724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 291ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2923724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLvoid deleteFramebuffers(GrGLsizei n, const GrGLuint *frameBuffers) override { 293ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2943724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // first potentially unbind the buffers 2953724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (this->getFrameBuffer()) { 2963724e574a744491b7cfb8187ac865a70ef3d4528bsalomon for (int i = 0; i < n; ++i) { 297ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 2983724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (frameBuffers[i] == 2993724e574a744491b7cfb8187ac865a70ef3d4528bsalomon this->getFrameBuffer()->getID()) { 3003724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // this ID is the current frame buffer - rebind to the default 3013724e574a744491b7cfb8187ac865a70ef3d4528bsalomon this->setFrameBuffer(nullptr); 3023724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3033724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3043724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3053724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3063724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // then actually "delete" the buffers 3073724e574a744491b7cfb8187ac865a70ef3d4528bsalomon for (int i = 0; i < n; ++i) { 3083724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrFrameBufferObj *buffer = FIND(frameBuffers[i], GrFrameBufferObj, 3093724e574a744491b7cfb8187ac865a70ef3d4528bsalomon kFrameBuffer_ObjTypes); 3103724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(buffer); 3113724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3123724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(!buffer->getDeleted()); 3133724e574a744491b7cfb8187ac865a70ef3d4528bsalomon buffer->deleteAction(); 3143724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3153724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3163724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3173724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLvoid deleteRenderbuffers(GrGLsizei n,const GrGLuint *renderBuffers) override { 3183724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3193724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // first potentially unbind the buffers 3203724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (this->getRenderBuffer()) { 3213724e574a744491b7cfb8187ac865a70ef3d4528bsalomon for (int i = 0; i < n; ++i) { 3223724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3233724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (renderBuffers[i] == 3243724e574a744491b7cfb8187ac865a70ef3d4528bsalomon this->getRenderBuffer()->getID()) { 3253724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // this ID is the current render buffer - make no 3263724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // render buffer be bound 3273724e574a744491b7cfb8187ac865a70ef3d4528bsalomon this->setRenderBuffer(nullptr); 3283724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3293724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3303724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3313724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3323724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // TODO: fuse the following block with DeleteTextures? 3333724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // Open GL will remove a deleted render buffer from the active frame 3343724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // buffer but not from any other frame buffer 3353724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (this->getFrameBuffer()) { 3363724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3373724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrFrameBufferObj *frameBuffer = this->getFrameBuffer(); 3383724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3393724e574a744491b7cfb8187ac865a70ef3d4528bsalomon for (int i = 0; i < n; ++i) { 3403724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3413724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (frameBuffer->getColor() && 3423724e574a744491b7cfb8187ac865a70ef3d4528bsalomon renderBuffers[i] == frameBuffer->getColor()->getID()) { 3433724e574a744491b7cfb8187ac865a70ef3d4528bsalomon frameBuffer->setColor(nullptr); 3443724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3453724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (frameBuffer->getDepth() && 3463724e574a744491b7cfb8187ac865a70ef3d4528bsalomon renderBuffers[i] == frameBuffer->getDepth()->getID()) { 3473724e574a744491b7cfb8187ac865a70ef3d4528bsalomon frameBuffer->setDepth(nullptr); 3483724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3493724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (frameBuffer->getStencil() && 3503724e574a744491b7cfb8187ac865a70ef3d4528bsalomon renderBuffers[i] == frameBuffer->getStencil()->getID()) { 3513724e574a744491b7cfb8187ac865a70ef3d4528bsalomon frameBuffer->setStencil(nullptr); 3523724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3533724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3543724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3553724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3563724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // then actually "delete" the buffers 3573724e574a744491b7cfb8187ac865a70ef3d4528bsalomon for (int i = 0; i < n; ++i) { 3583724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrRenderBufferObj *buffer = FIND(renderBuffers[i], GrRenderBufferObj, 3593724e574a744491b7cfb8187ac865a70ef3d4528bsalomon kRenderBuffer_ObjTypes); 3603724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(buffer); 3613724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3623724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // OpenGL gives no guarantees if a render buffer is deleted 3633724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // while attached to something other than the currently 3643724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // bound frame buffer 3653724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(!buffer->getColorBound()); 3663724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(!buffer->getDepthBound()); 3673724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // However, at GrContext destroy time we release all GrRsources and so stencil buffers 3683724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // may get deleted before FBOs that refer to them. 3693724e574a744491b7cfb8187ac865a70ef3d4528bsalomon //GrAlwaysAssert(!buffer->getStencilBound()); 3703724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 3713724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(!buffer->getDeleted()); 3723724e574a744491b7cfb8187ac865a70ef3d4528bsalomon buffer->deleteAction(); 3733724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3743724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 3753724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 376b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLvoid renderbufferStorage(GrGLenum target, GrGLenum internalformat, GrGLsizei width, 377b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLsizei height) override { 378b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrAlwaysAssert(GR_GL_RENDERBUFFER == target); 379b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrRenderBufferObj* renderBuffer = this->getRenderBuffer(); 380b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrAlwaysAssert(renderBuffer); 381b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton renderBuffer->setNumSamples(1); 382b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 383b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton 384b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLvoid renderbufferStorageMultisample(GrGLenum target, GrGLsizei samples, 385b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLenum internalformat, GrGLsizei width, 386b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLsizei height) override { 387b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrAlwaysAssert(GR_GL_RENDERBUFFER == target); 388b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrRenderBufferObj* renderBuffer = this->getRenderBuffer(); 389b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrAlwaysAssert(renderBuffer); 390b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton renderBuffer->setNumSamples(samples); 391b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 392b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton 393b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLvoid namedRenderbufferStorage(GrGLuint renderbuffer, GrGLenum GrGLinternalformat, 394b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLsizei width, GrGLsizei height) override { 395b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton SK_ABORT("Not implemented"); 396b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 397b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton 398b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLvoid namedRenderbufferStorageMultisample(GrGLuint renderbuffer, GrGLsizei samples, 399b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLenum GrGLinternalformat, GrGLsizei width, 400b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLsizei height) override { 401b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton SK_ABORT("Not implemented"); 402b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 403b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton 4043724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLvoid framebufferRenderbuffer(GrGLenum target, 4053724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLenum attachment, 4063724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLenum renderbuffertarget, 4073724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLuint renderBufferID) override { 4083724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 4093724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(GR_GL_FRAMEBUFFER == target); 4103724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(GR_GL_COLOR_ATTACHMENT0 == attachment || 4113724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GR_GL_DEPTH_ATTACHMENT == attachment || 4123724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GR_GL_STENCIL_ATTACHMENT == attachment); 4133724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(GR_GL_RENDERBUFFER == renderbuffertarget); 4143724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 4153724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrFrameBufferObj *framebuffer = this->getFrameBuffer(); 4163724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // A render buffer cannot be attached to the default framebuffer 4173724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(framebuffer); 4183724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 4193724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // a renderBufferID of 0 is acceptable - it unbinds the current 4203724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // render buffer 4213724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrRenderBufferObj *renderbuffer = FIND(renderBufferID, GrRenderBufferObj, 4223724e574a744491b7cfb8187ac865a70ef3d4528bsalomon kRenderBuffer_ObjTypes); 4233724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 4243724e574a744491b7cfb8187ac865a70ef3d4528bsalomon switch (attachment) { 4253724e574a744491b7cfb8187ac865a70ef3d4528bsalomon case GR_GL_COLOR_ATTACHMENT0: 4263724e574a744491b7cfb8187ac865a70ef3d4528bsalomon framebuffer->setColor(renderbuffer); 4273724e574a744491b7cfb8187ac865a70ef3d4528bsalomon break; 4283724e574a744491b7cfb8187ac865a70ef3d4528bsalomon case GR_GL_DEPTH_ATTACHMENT: 4293724e574a744491b7cfb8187ac865a70ef3d4528bsalomon framebuffer->setDepth(renderbuffer); 4303724e574a744491b7cfb8187ac865a70ef3d4528bsalomon break; 4313724e574a744491b7cfb8187ac865a70ef3d4528bsalomon case GR_GL_STENCIL_ATTACHMENT: 4323724e574a744491b7cfb8187ac865a70ef3d4528bsalomon framebuffer->setStencil(renderbuffer); 4333724e574a744491b7cfb8187ac865a70ef3d4528bsalomon break; 4343724e574a744491b7cfb8187ac865a70ef3d4528bsalomon default: 4353724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(false); 4363724e574a744491b7cfb8187ac865a70ef3d4528bsalomon break; 4373724e574a744491b7cfb8187ac865a70ef3d4528bsalomon }; 4383724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 4393724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 4403724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 441b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLvoid namedFramebufferRenderbuffer(GrGLuint framebuffer, GrGLenum attachment, 442b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLenum renderbuffertarget, 443b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLuint renderbuffer) override { 444b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton SK_ABORT("Not implemented"); 445b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 446b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton 4473724e574a744491b7cfb8187ac865a70ef3d4528bsalomon //////////////////////////////////////////////////////////////////////////////// 4483724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLvoid framebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget, 4493724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLuint textureID, GrGLint level) override { 4503724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 4513724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(GR_GL_FRAMEBUFFER == target); 4523724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(GR_GL_COLOR_ATTACHMENT0 == attachment || 4533724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GR_GL_DEPTH_ATTACHMENT == attachment || 4543724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GR_GL_STENCIL_ATTACHMENT == attachment); 4553724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(GR_GL_TEXTURE_2D == textarget); 4563724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 4573724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrFrameBufferObj *framebuffer = this->getFrameBuffer(); 4583724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // A texture cannot be attached to the default framebuffer 4593724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(framebuffer); 4603724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 4613724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // A textureID of 0 is allowed - it unbinds the currently bound texture 4623724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrTextureObj *texture = FIND(textureID, GrTextureObj, kTexture_ObjTypes); 4633724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (texture) { 4643724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // The texture shouldn't be bound to a texture unit - this 4653724e574a744491b7cfb8187ac865a70ef3d4528bsalomon // could lead to a feedback loop 4663724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(!texture->getBound()); 4673724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 4683724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 4693724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(0 == level); 4703724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 4713724e574a744491b7cfb8187ac865a70ef3d4528bsalomon switch (attachment) { 4723724e574a744491b7cfb8187ac865a70ef3d4528bsalomon case GR_GL_COLOR_ATTACHMENT0: 4733724e574a744491b7cfb8187ac865a70ef3d4528bsalomon framebuffer->setColor(texture); 4743724e574a744491b7cfb8187ac865a70ef3d4528bsalomon break; 4753724e574a744491b7cfb8187ac865a70ef3d4528bsalomon case GR_GL_DEPTH_ATTACHMENT: 4763724e574a744491b7cfb8187ac865a70ef3d4528bsalomon framebuffer->setDepth(texture); 4773724e574a744491b7cfb8187ac865a70ef3d4528bsalomon break; 4783724e574a744491b7cfb8187ac865a70ef3d4528bsalomon case GR_GL_STENCIL_ATTACHMENT: 4793724e574a744491b7cfb8187ac865a70ef3d4528bsalomon framebuffer->setStencil(texture); 4803724e574a744491b7cfb8187ac865a70ef3d4528bsalomon break; 4813724e574a744491b7cfb8187ac865a70ef3d4528bsalomon default: 4823724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrAlwaysAssert(false); 4833724e574a744491b7cfb8187ac865a70ef3d4528bsalomon break; 4843724e574a744491b7cfb8187ac865a70ef3d4528bsalomon }; 4853724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 486ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 487b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLvoid framebufferTexture2DMultisample(GrGLenum target, GrGLenum attachment, 488b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLenum textarget, GrGLuint texture, GrGLint level, 489b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLsizei samples) override { 490b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton SK_ABORT("Not implemented"); 491b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 492b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton 493b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLvoid namedFramebufferTexture1D(GrGLuint framebuffer, GrGLenum attachment, 494b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLenum textarget, GrGLuint texture, 495b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLint level) override { 496b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton SK_ABORT("Not implemented"); 497b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 498b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton 499b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLvoid namedFramebufferTexture2D(GrGLuint framebuffer, GrGLenum attachment, 500b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLenum textarget, GrGLuint texture, 501b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLint level) override { 502b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton SK_ABORT("Not implemented"); 503b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 504b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton 505b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLvoid namedFramebufferTexture3D(GrGLuint framebuffer, GrGLenum attachment, 506b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLenum textarget, GrGLuint texture, GrGLint level, 507b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrGLint zoffset) override { 508b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton SK_ABORT("Not implemented"); 509b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 510b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton 5113c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLuint createProgram() override { 5123c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 5133c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrProgramObj *program = CREATE(GrProgramObj, kProgram_ObjTypes); 514ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 5153c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return program->getID(); 5163c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 517ebde3e0e74ccb82042b742dddb9b3cf877c82f6frobertphillips@google.com 5183c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLuint createShader(GrGLenum type) override { 5190da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 5203c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(GR_GL_VERTEX_SHADER == type || 5213c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GR_GL_FRAGMENT_SHADER == type); 5220da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 5233c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrShaderObj *shader = CREATE(GrShaderObj, kShader_ObjTypes); 5243c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon shader->setType(type); 5250da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 5263c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return shader->getID(); 5273c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 528fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 5293c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLenum checkFramebufferStatus(GrGLenum target) override { return GR_GL_FRAMEBUFFER_COMPLETE; } 5300da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 5313c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid deleteProgram(GrGLuint programID) override { 5320da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 5333c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrProgramObj *program = FIND(programID, GrProgramObj, kProgram_ObjTypes); 5343c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(program); 5350da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 5363c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (program->getRefCount()) { 5373c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // someone is still using this program so we can't delete it here 5383c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon program->setMarkedForDeletion(); 5393c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } else { 5403c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon program->deleteAction(); 5413c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 5423c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 5433c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 5443c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid deleteShader(GrGLuint shaderID) override { 5450da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 5463c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrShaderObj *shader = FIND(shaderID, GrShaderObj, kShader_ObjTypes); 5473c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(shader); 5480da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 5493c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (shader->getRefCount()) { 5503c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // someone is still using this shader so we can't delete it here 5513c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon shader->setMarkedForDeletion(); 5523c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } else { 5533c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon shader->deleteAction(); 5543c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 5553c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 5563c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 5573c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid genBuffers(GrGLsizei n, GrGLuint* ids) override { 5583c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->genObjs(kBuffer_ObjTypes, n, ids); 5593c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 5603c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 5613c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid genFramebuffers(GrGLsizei n, GrGLuint* ids) override { 5623c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->genObjs(kFrameBuffer_ObjTypes, n, ids); 5633c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 5643c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 5653c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid genRenderbuffers(GrGLsizei n, GrGLuint* ids) override { 5663c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->genObjs(kRenderBuffer_ObjTypes, n, ids); 5670da3719050473344b6013fd7b614611984f20effrobertphillips@google.com } 5680da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 5693c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid genTextures(GrGLsizei n, GrGLuint* ids) override { 5703c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->genObjs(kTexture_ObjTypes, n, ids); 5713c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 5723c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 5733c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid genVertexArrays(GrGLsizei n, GrGLuint* ids) override { 5743c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->genObjs(kVertexArray_ObjTypes, n, ids); 5753c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 5760da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 5773c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid genQueries(GrGLsizei n, GrGLuint *ids) override { this->genGenericIds(n, ids); } 5783c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 5793c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLenum getError() override { return GR_GL_NO_ERROR; } 5803c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 5813c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getIntegerv(GrGLenum pname, GrGLint* params) override { 5823c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // TODO: remove from Ganesh the #defines for gets we don't use. 5833c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // We would like to minimize gets overall due to performance issues 5843c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon switch (pname) { 5853c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_CONTEXT_PROFILE_MASK: 5863c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = GR_GL_CONTEXT_COMPATIBILITY_PROFILE_BIT; 5873c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 5883c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_STENCIL_BITS: 5893c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 8; 5903c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 591b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton case GR_GL_SAMPLES: { 592b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrFrameBufferObj* framebuffer = this->getFrameBuffer(); 593b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrAlwaysAssert(framebuffer); 594b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton int numSamples = 0; 595b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton 596b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton if (GrFBBindableObj* stencil = framebuffer->getStencil()) { 597b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton numSamples = stencil->numSamples(); 598b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 599b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton if (GrFBBindableObj* depth = framebuffer->getDepth()) { 600b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrAlwaysAssert(!numSamples || numSamples == depth->numSamples()); 601b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton numSamples = depth->numSamples(); 602b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 603b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton if (GrFBBindableObj* color = framebuffer->getColor()) { 604b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrAlwaysAssert(!numSamples || numSamples == color->numSamples()); 605b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton numSamples = color->numSamples(); 606b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 607b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton GrAlwaysAssert(numSamples); 608b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton *params = numSamples; 6093c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 610b593a76749c6c7e12bf86aeaa06e1e52708e9bdfcsmartdalton } 6113c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_FRAMEBUFFER_BINDING: 6123c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 0; 6133c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6143c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_VIEWPORT: 6153c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon params[0] = 0; 6163c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon params[1] = 0; 6173c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon params[2] = 800; 6183c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon params[3] = 600; 6193c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6203c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: 6213c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS: 6223c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_TEXTURE_IMAGE_UNITS: 6233c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: 6243c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 8; 6253c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6263c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_TEXTURE_COORDS: 6273c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 8; 6283c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6293c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_VERTEX_UNIFORM_VECTORS: 6303c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = kDefaultMaxVertexUniformVectors; 6313c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6323c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS: 6333c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = kDefaultMaxFragmentUniformVectors; 6343c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6353c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: 6363c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 16 * 4; 6373c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6383c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS: 6393c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 0; 6403c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6413c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_COMPRESSED_TEXTURE_FORMATS: 6423c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6433c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_TEXTURE_SIZE: 6443c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 8192; 6453c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6463c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_RENDERBUFFER_SIZE: 6473c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 8192; 6483c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6493c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_SAMPLES: 6503c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 32; 6513c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6523c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_VERTEX_ATTRIBS: 6533c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = kDefaultMaxVertexAttribs; 6543c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6553c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_MAX_VARYING_VECTORS: 6563c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = kDefaultMaxVaryingVectors; 6573c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6583c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_NUM_EXTENSIONS: { 6593c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint i = 0; 6603c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon while (kExtensions[i++]); 6613c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = i; 6623c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6633c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 6643c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon default: 6653c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon SkFAIL("Unexpected pname to GetIntegerv"); 6663c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 6673c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 6683c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 6693c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getMultisamplefv(GrGLenum pname, GrGLuint index, GrGLfloat* val) override { 6703c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon val[0] = val[1] = 0.5f; 6713c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 6720da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 6733c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getProgramiv(GrGLuint program, GrGLenum pname, GrGLint* params) override { 6743c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->getShaderOrProgramiv(program, pname, params); 6750da3719050473344b6013fd7b614611984f20effrobertphillips@google.com } 6760da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 6773c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getProgramInfoLog(GrGLuint program, GrGLsizei bufsize, GrGLsizei* length, 6783c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon char* infolog) override { 6793c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->getInfoLog(program, bufsize, length, infolog); 6803c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 6810da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 6823c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getQueryiv(GrGLenum GLtarget, GrGLenum pname, GrGLint *params) override { 6833c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon switch (pname) { 6843c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_CURRENT_QUERY: 6853c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 0; 6863c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6873c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_QUERY_COUNTER_BITS: 6883c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 32; 6893c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 6903c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon default: 6913c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon SkFAIL("Unexpected pname passed GetQueryiv."); 6923c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 6930da3719050473344b6013fd7b614611984f20effrobertphillips@google.com } 6940da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 6953c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getQueryObjecti64v(GrGLuint id, GrGLenum pname, GrGLint64 *params) override { 6963c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->queryResult(id, pname, params); 6973c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 698ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 6993c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getQueryObjectiv(GrGLuint id, GrGLenum pname, GrGLint *params) override { 7003c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->queryResult(id, pname, params); 7013c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 702cffff79a40bd7672e13b31b9801a3f3cda64875ecommit-bot@chromium.org 7033c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getQueryObjectui64v(GrGLuint id, GrGLenum pname, GrGLuint64 *params) override { 7043c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->queryResult(id, pname, params); 7053c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 706f6f123d23608a4a5fe9c812d2452039a18da7e0brobertphillips@google.com 7073c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getQueryObjectuiv(GrGLuint id, GrGLenum pname, GrGLuint *params) override { 7083c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->queryResult(id, pname, params); 7093c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 710ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 7113c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getShaderiv(GrGLuint shader, GrGLenum pname, GrGLint* params) override { 7123c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->getShaderOrProgramiv(shader, pname, params); 7133c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 71487c6d7a99ee7fee2dcc537a1ccad95fc5a9bd26bbsalomon@google.com 7153c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getShaderInfoLog(GrGLuint shader, GrGLsizei bufsize, GrGLsizei* length, 7163c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon char* infolog) override { 7173c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->getInfoLog(shader, bufsize, length, infolog); 7183c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 71987c6d7a99ee7fee2dcc537a1ccad95fc5a9bd26bbsalomon@google.com 7203c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon const GrGLubyte* getString(GrGLenum name) override { 7213c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon switch (name) { 7223c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_EXTENSIONS: 7233c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return CombinedExtensionString(); 7243c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_VERSION: 7253c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return (const GrGLubyte*)"4.0 Debug GL"; 7263c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_SHADING_LANGUAGE_VERSION: 7273c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return (const GrGLubyte*)"4.20.8 Debug GLSL"; 7283c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_VENDOR: 7293c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return (const GrGLubyte*)"Debug Vendor"; 7303c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_RENDERER: 7313c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return (const GrGLubyte*)"The Debug (Non-)Renderer"; 7323c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon default: 7333c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon SkFAIL("Unexpected name passed to GetString"); 7343c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return nullptr; 7353c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 7363c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 737ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com 7383c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon const GrGLubyte* getStringi(GrGLenum name, GrGLuint i) override { 7393c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon switch (name) { 7403c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_EXTENSIONS: { 7413c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint count; 7423c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->getIntegerv(GR_GL_NUM_EXTENSIONS, &count); 7433c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if ((GrGLint)i <= count) { 7443c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return (const GrGLubyte*) kExtensions[i]; 7453c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } else { 7463c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return nullptr; 7473c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 7483c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 7493c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon default: 7503c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon SkFAIL("Unexpected name passed to GetStringi"); 7513c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return nullptr; 752ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com } 7533c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 754ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com 7553c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getTexLevelParameteriv(GrGLenum target, GrGLint level, GrGLenum pname, 7563c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint* params) override { 7573c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // we used to use this to query stuff about externally created textures, 7583c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // now we just require clients to tell us everything about the texture. 7593c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon SkFAIL("Should never query texture parameters."); 7603c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 7613c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 7623c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid deleteVertexArrays(GrGLsizei n, const GrGLuint* ids) override { 7633c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon for (GrGLsizei i = 0; i < n; ++i) { 7643c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrVertexArrayObj* array = FIND(ids[i], GrVertexArrayObj, kVertexArray_ObjTypes); 7653c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(array); 7663c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 7673c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // Deleting the current vertex array binds object 0 7683c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (this->getVertexArray() == array) { 7693c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->setVertexArray(nullptr); 7703c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 7713c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 7723c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (array->getRefCount()) { 7733c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // someone is still using this vertex array so we can't delete it here 7743c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon array->setMarkedForDeletion(); 7753c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } else { 7763c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon array->deleteAction(); 7773c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 778ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com } 779ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com } 780ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com 7813c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid bindVertexArray(GrGLuint id) override { 7823c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrVertexArrayObj* array = FIND(id, GrVertexArrayObj, kVertexArray_ObjTypes); 7833c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert((0 == id) || array); 7843c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon this->setVertexArray(array); 7853c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 7863c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 7873c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid bindBuffer(GrGLenum target, GrGLuint bufferID) override { 7883c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrBufferObj *buffer = FIND(bufferID, GrBufferObj, kBuffer_ObjTypes); 7893c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // 0 is a permissible bufferID - it unbinds the current buffer 7903c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 7919b972c4a1278c16d7237563560710774edb43b3ccsmartdalton this->setBuffer(GetBufferIndex(target), buffer); 7923c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 793ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com 7943c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // deleting a bound buffer has the side effect of binding 0 7953c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid deleteBuffers(GrGLsizei n, const GrGLuint* ids) override { 7963c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // first potentially unbind the buffers 7979b972c4a1278c16d7237563560710774edb43b3ccsmartdalton for (int buffIdx = 0; buffIdx < kNumBufferTargets; ++buffIdx) { 7989b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrBufferObj* buffer = fBoundBuffers[buffIdx]; 7999b972c4a1278c16d7237563560710774edb43b3ccsmartdalton if (!buffer) { 8009b972c4a1278c16d7237563560710774edb43b3ccsmartdalton continue; 8013c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 8029b972c4a1278c16d7237563560710774edb43b3ccsmartdalton for (int i = 0; i < n; ++i) { 8039b972c4a1278c16d7237563560710774edb43b3ccsmartdalton if (ids[i] == buffer->getID()) { 8049b972c4a1278c16d7237563560710774edb43b3ccsmartdalton this->setBuffer(buffIdx, nullptr); 8059b972c4a1278c16d7237563560710774edb43b3ccsmartdalton break; 8069b972c4a1278c16d7237563560710774edb43b3ccsmartdalton } 8073c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 8083c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 8090da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 8103c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // then actually "delete" the buffers 8113c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon for (int i = 0; i < n; ++i) { 8123c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrBufferObj *buffer = FIND(ids[i], GrBufferObj, kBuffer_ObjTypes); 8133c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(buffer); 8140da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 8153c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!buffer->getDeleted()); 8163c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon buffer->deleteAction(); 8173c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 8180da3719050473344b6013fd7b614611984f20effrobertphillips@google.com } 8190da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 8203c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // map a buffer to the caller's address space 8213c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid* mapBufferRange(GrGLenum target, GrGLintptr offset, GrGLsizeiptr length, 8223c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLbitfield access) override { 8233c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // We only expect read access and we expect that the buffer or range is always invalidated. 8243c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!SkToBool(GR_GL_MAP_READ_BIT & access)); 8253c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert((GR_GL_MAP_INVALIDATE_BUFFER_BIT | GR_GL_MAP_INVALIDATE_RANGE_BIT) & access); 8263c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 8279b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrBufferObj *buffer = fBoundBuffers[GetBufferIndex(target)]; 8283c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (buffer) { 8293c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(offset >= 0 && offset + length <= buffer->getSize()); 8303c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!buffer->getMapped()); 8313c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon buffer->setMapped(offset, length); 8323c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return buffer->getDataPtr() + offset; 8330da3719050473344b6013fd7b614611984f20effrobertphillips@google.com } 8343c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 8353c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(false); 8363c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return nullptr; // no buffer bound to the target 8373c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 8383c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 8393c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid* mapBuffer(GrGLenum target, GrGLenum access) override { 8403c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(GR_GL_WRITE_ONLY == access); 8419b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrBufferObj *buffer = fBoundBuffers[GetBufferIndex(target)]; 8423c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return this->mapBufferRange(target, 0, buffer->getSize(), 8433c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GR_GL_MAP_WRITE_BIT | GR_GL_MAP_INVALIDATE_BUFFER_BIT); 8440da3719050473344b6013fd7b614611984f20effrobertphillips@google.com } 8450da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 8463c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // remove a buffer from the caller's address space 8473c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // TODO: check if the "access" method from "glMapBuffer" was honored 8483c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLboolean unmapBuffer(GrGLenum target) override { 8499b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrBufferObj *buffer = fBoundBuffers[GetBufferIndex(target)]; 8503c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (buffer) { 8513c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(buffer->getMapped()); 8523c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon buffer->resetMapped(); 8533c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return GR_GL_TRUE; 8543c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 8550da3719050473344b6013fd7b614611984f20effrobertphillips@google.com 856160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org GrAlwaysAssert(false); 8573c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return GR_GL_FALSE; // GR_GL_INVALID_OPERATION; 858160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org } 8593c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 8603c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid flushMappedBufferRange(GrGLenum target, GrGLintptr offset, 8613c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLsizeiptr length) override { 8629b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrBufferObj *buffer = fBoundBuffers[GetBufferIndex(target)]; 8633c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (buffer) { 8643c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(buffer->getMapped()); 8653c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(offset >= 0 && (offset + length) <= buffer->getMappedLength()); 8663c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } else { 8673c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(false); 8683c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 8690da3719050473344b6013fd7b614611984f20effrobertphillips@google.com } 870cf6285b89b8820641ffb6871d4b3275bfe783f51caryclark@google.com 8713c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getBufferParameteriv(GrGLenum target, GrGLenum value, GrGLint* params) override { 8723c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 8733c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(GR_GL_BUFFER_SIZE == value || 8743c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GR_GL_BUFFER_USAGE == value); 8753c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 8769b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrBufferObj *buffer = fBoundBuffers[GetBufferIndex(target)]; 8773c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(buffer); 8783c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 8793c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon switch (value) { 8803c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_BUFFER_MAPPED: 8813c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = GR_GL_FALSE; 8823c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (buffer) 8833c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = buffer->getMapped() ? GR_GL_TRUE : GR_GL_FALSE; 8843c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 8853c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_BUFFER_SIZE: 8863c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 0; 8873c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (buffer) 8883c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = SkToInt(buffer->getSize()); 8893c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 8903c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_BUFFER_USAGE: 8913c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = GR_GL_STATIC_DRAW; 8923c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (buffer) 8933c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = buffer->getUsage(); 8943c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 8953c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon default: 8963c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon SkFAIL("Unexpected value to glGetBufferParamateriv"); 8973c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 8983c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 8993c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 900ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 901ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.comprivate: 9029b972c4a1278c16d7237563560710774edb43b3ccsmartdalton inline int static GetBufferIndex(GrGLenum glTarget) { 9039b972c4a1278c16d7237563560710774edb43b3ccsmartdalton switch (glTarget) { 9049b972c4a1278c16d7237563560710774edb43b3ccsmartdalton default: SkFAIL("Unexpected GL target to GetBufferIndex"); 9059b972c4a1278c16d7237563560710774edb43b3ccsmartdalton case GR_GL_ARRAY_BUFFER: return 0; 9069b972c4a1278c16d7237563560710774edb43b3ccsmartdalton case GR_GL_ELEMENT_ARRAY_BUFFER: return 1; 9079b972c4a1278c16d7237563560710774edb43b3ccsmartdalton case GR_GL_TEXTURE_BUFFER: return 2; 9089b972c4a1278c16d7237563560710774edb43b3ccsmartdalton case GR_GL_DRAW_INDIRECT_BUFFER: return 3; 9099b972c4a1278c16d7237563560710774edb43b3ccsmartdalton } 9109b972c4a1278c16d7237563560710774edb43b3ccsmartdalton } 9119b972c4a1278c16d7237563560710774edb43b3ccsmartdalton constexpr int static kNumBufferTargets = 4; 9129b972c4a1278c16d7237563560710774edb43b3ccsmartdalton 9133c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // the OpenGLES 2.0 spec says this must be >= 128 9143c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon static const GrGLint kDefaultMaxVertexUniformVectors = 128; 9153c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 9163c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // the OpenGLES 2.0 spec says this must be >=16 9173c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon static const GrGLint kDefaultMaxFragmentUniformVectors = 16; 9183c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 9193c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // the OpenGLES 2.0 spec says this must be >= 8 9203c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon static const GrGLint kDefaultMaxVertexAttribs = 8; 9213c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 9223c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // the OpenGLES 2.0 spec says this must be >= 8 9233c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon static const GrGLint kDefaultMaxVaryingVectors = 8; 9243c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 9253c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // the OpenGLES 2.0 spec says this must be >= 2 9263c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon static const GrGLint kDefaultMaxTextureUnits = 8; 9273c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 9283c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon static const char* kExtensions[]; 9293c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 9303c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLuint fCurrGenericID; 9313c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLuint fCurrTextureUnit; 9323c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrTextureUnitObj* fTextureUnits[kDefaultMaxTextureUnits]; 9339b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrBufferObj* fBoundBuffers[kNumBufferTargets]; 9343c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrVertexArrayObj* fVertexArray; 9353c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint fPackRowLength; 9363c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint fUnpackRowLength; 9373c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLint fPackAlignment; 9383c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrFrameBufferObj* fFrameBuffer; 9393c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrRenderBufferObj* fRenderBuffer; 9403c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrProgramObj* fProgram; 9413c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon mutable bool fAbandoned; 9423c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // global store of all objects 9433c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon SkTArray<GrFakeRefObj *> fObjects; 9443c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 9453c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon static const GrGLubyte* CombinedExtensionString() { 9463c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon static SkString gExtString; 9473c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon static SkMutex gMutex; 9483c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon gMutex.acquire(); 9493c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (0 == gExtString.size()) { 9503c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon int i = 0; 9513c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon while (kExtensions[i]) { 9523c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (i > 0) { 9533c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon gExtString.append(" "); 9543c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 9553c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon gExtString.append(kExtensions[i]); 9563c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon ++i; 9573c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 9583c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 9593c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon gMutex.release(); 9603c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return (const GrGLubyte*) gExtString.c_str(); 9613c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 962ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 9633c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid genGenericIds(GrGLsizei n, GrGLuint* ids) { 9643c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon for (int i = 0; i < n; ++i) { 9653c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon ids[i] = ++fCurrGenericID; 9663c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 9673c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 9683c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 9693c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getInfoLog(GrGLuint object, GrGLsizei bufsize, GrGLsizei* length, 9703c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon char* infolog) { 9713c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (length) { 9723c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *length = 0; 9733c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 9743c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (bufsize > 0) { 9753c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *infolog = 0; 9763c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 9773c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 9783c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 9793c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid getShaderOrProgramiv(GrGLuint object, GrGLenum pname, GrGLint* params) { 9803c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon switch (pname) { 9813c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_LINK_STATUS: // fallthru 9823c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_COMPILE_STATUS: 9833c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = GR_GL_TRUE; 9843c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 9853c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_INFO_LOG_LENGTH: 9863c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 0; 9873c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 9883c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // we don't expect any other pnames 9893c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon default: 9903c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon SkFAIL("Unexpected pname to GetProgramiv"); 9913c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 9923c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 9933c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 9943c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 9953c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon template <typename T> 9963c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon void queryResult(GrGLenum GLtarget, GrGLenum pname, T *params) { 9973c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon switch (pname) { 9983c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_QUERY_RESULT_AVAILABLE: 9993c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = GR_GL_TRUE; 10003c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 10013c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon case GR_GL_QUERY_RESULT: 10023c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon *params = 0; 10033c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 10043c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon default: 10053c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon SkFAIL("Unexpected pname passed to GetQueryObject."); 10063c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon break; 10073c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10083c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10093c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10103c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon enum ObjTypes { 10113c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon kTexture_ObjTypes = 0, 10123c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon kBuffer_ObjTypes, 10133c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon kRenderBuffer_ObjTypes, 10143c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon kFrameBuffer_ObjTypes, 10153c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon kShader_ObjTypes, 10163c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon kProgram_ObjTypes, 10173c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon kTextureUnit_ObjTypes, 10183c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon kVertexArray_ObjTypes, 10193c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon kObjTypeCount 10203c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon }; 10213c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10223c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon typedef GrFakeRefObj *(*Create)(); 10233c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10243c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon static Create gFactoryFunc[kObjTypeCount]; 10253c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10263c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrGLvoid genObjs(ObjTypes type, GrGLsizei n, GrGLuint* ids) { 10273c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon for (int i = 0; i < n; ++i) { 10283c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(ids[i] == 0); 10293c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrFakeRefObj *obj = this->createObj(type); 10303c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(obj); 10313c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon ids[i] = obj->getID(); 10323c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10333c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10343c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10353c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrFakeRefObj* createObj(ObjTypes type) { 10363c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrFakeRefObj *temp = (*gFactoryFunc[type])(); 10373c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10383c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fObjects.push_back(temp); 10393c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10403c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return temp; 10413c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10423c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10433c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrFakeRefObj* findObject(GrGLuint ID, ObjTypes type) { 10443c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon for (int i = 0; i < fObjects.count(); ++i) { 10453c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (fObjects[i]->getID() == ID) { // && fObjects[i]->getType() == type) { 10463c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // The application shouldn't be accessing objects 10473c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // that (as far as OpenGL knows) were already deleted 10483c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!fObjects[i]->getDeleted()); 10493c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!fObjects[i]->getMarkedForDeletion()); 10503c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return fObjects[i]; 10513c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10523c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10533c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return nullptr; 10543c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10553c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10563c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrTextureUnitObj* getTextureUnit(int unit) { 10573c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(0 <= unit && kDefaultMaxTextureUnits > unit); 10583c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10593c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon return fTextureUnits[unit]; 10603c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 1061ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 10629b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrGLvoid setBuffer(int buffIdx, GrBufferObj* buffer) { 10639b972c4a1278c16d7237563560710774edb43b3ccsmartdalton if (fBoundBuffers[buffIdx]) { 10643c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon // automatically break the binding of the old buffer 10659b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrAlwaysAssert(fBoundBuffers[buffIdx]->getBound()); 10669b972c4a1278c16d7237563560710774edb43b3ccsmartdalton fBoundBuffers[buffIdx]->resetBound(); 10673c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10689b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrAlwaysAssert(!fBoundBuffers[buffIdx]->getDeleted()); 10699b972c4a1278c16d7237563560710774edb43b3ccsmartdalton fBoundBuffers[buffIdx]->unref(); 10703c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10713c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10729b972c4a1278c16d7237563560710774edb43b3ccsmartdalton if (buffer) { 10739b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrAlwaysAssert(!buffer->getDeleted()); 10749b972c4a1278c16d7237563560710774edb43b3ccsmartdalton buffer->ref(); 10753c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10769b972c4a1278c16d7237563560710774edb43b3ccsmartdalton GrAlwaysAssert(!buffer->getBound()); 10779b972c4a1278c16d7237563560710774edb43b3ccsmartdalton buffer->setBound(); 10783c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10793c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10809b972c4a1278c16d7237563560710774edb43b3ccsmartdalton fBoundBuffers[buffIdx] = buffer; 10813c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10823c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10833c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon void setVertexArray(GrVertexArrayObj* vertexArray) { 10843c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (vertexArray) { 10853c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon SkASSERT(!vertexArray->getDeleted()); 10863c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10873c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon SkRefCnt_SafeAssign(fVertexArray, vertexArray); 10883c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10893c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10903c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrVertexArrayObj* getVertexArray() { return fVertexArray; } 10913c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10923c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon void setTexture(GrTextureObj *texture) { 10933c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fTextureUnits[fCurrTextureUnit]->setTexture(texture); 10943c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 10953c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 10963c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon void setFrameBuffer(GrFrameBufferObj *frameBuffer) { 10973c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (fFrameBuffer) { 10983c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(fFrameBuffer->getBound()); 10993c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fFrameBuffer->resetBound(); 11003c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11013c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!fFrameBuffer->getDeleted()); 11023c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fFrameBuffer->unref(); 11033c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11043c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11053c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fFrameBuffer = frameBuffer; 11063c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11073c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (fFrameBuffer) { 11083c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!fFrameBuffer->getDeleted()); 11093c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fFrameBuffer->ref(); 11103c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11113c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!fFrameBuffer->getBound()); 11123c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fFrameBuffer->setBound(); 11133c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11143c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11153c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11163c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrFrameBufferObj *getFrameBuffer() { return fFrameBuffer; } 11173c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11183c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon void setRenderBuffer(GrRenderBufferObj *renderBuffer) { 11193c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (fRenderBuffer) { 11203c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(fRenderBuffer->getBound()); 11213c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fRenderBuffer->resetBound(); 11223c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11233c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!fRenderBuffer->getDeleted()); 11243c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fRenderBuffer->unref(); 11253c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11263c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11273c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fRenderBuffer = renderBuffer; 11283c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11293c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (fRenderBuffer) { 11303c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!fRenderBuffer->getDeleted()); 11313c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fRenderBuffer->ref(); 11323c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11333c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!fRenderBuffer->getBound()); 11343c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fRenderBuffer->setBound(); 11353c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11363c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11373c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrRenderBufferObj *getRenderBuffer() { return fRenderBuffer; } 11383c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11393c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon void useProgram(GrProgramObj *program) { 11403c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (fProgram) { 11413c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(fProgram->getInUse()); 11423c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fProgram->resetInUse(); 11433c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11443c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!fProgram->getDeleted()); 11453c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fProgram->unref(); 11463c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11473c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11483c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fProgram = program; 11493c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11503c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (fProgram) { 11513c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!fProgram->getDeleted()); 11523c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fProgram->ref(); 11533c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11543c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(!fProgram->getInUse()); 11553c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon fProgram->setInUse(); 11563c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11573c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11583c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11593c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon void report() const { 11603c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon for (int i = 0; i < fObjects.count(); ++i) { 11613c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon if (!fAbandoned) { 11623c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(0 == fObjects[i]->getRefCount()); 11633c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrAlwaysAssert(fObjects[i]->getDeleted()); 11643c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11653c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11663c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon } 11673c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11683c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon typedef GrGLTestInterface INHERITED; 11693c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon}; 11703c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11713c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon#undef CREATE 11723c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon#undef FIND 11733c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 11743c481001b16288f604a5279bcb4bf46c5dd2b703bsalomonDebugInterface::Create DebugInterface::gFactoryFunc[kObjTypeCount] = { 11753c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrTextureObj::createGrTextureObj, 11763c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrBufferObj::createGrBufferObj, 11773c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrRenderBufferObj::createGrRenderBufferObj, 11783c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrFrameBufferObj::createGrFrameBufferObj, 11793c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrShaderObj::createGrShaderObj, 11803c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrProgramObj::createGrProgramObj, 11813c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrTextureUnitObj::createGrTextureUnitObj, 11823c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon GrVertexArrayObj::createGrVertexArrayObj, 1183ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com}; 1184ba0cc3ef1109c5ebba7e3fffda5408ce6120eb9drobertphillips@google.com 11853c481001b16288f604a5279bcb4bf46c5dd2b703bsalomonconst char* DebugInterface::kExtensions[] = { 11863c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon "GL_ARB_framebuffer_object", 11873c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon "GL_ARB_blend_func_extended", 11883c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon "GL_ARB_timer_query", 11893c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon "GL_ARB_draw_buffers", 11903c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon "GL_ARB_occlusion_query", 11913c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon "GL_EXT_stencil_wrap", 11923c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon nullptr, // signifies the end of the array. 11933c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon}; 11943c481001b16288f604a5279bcb4bf46c5dd2b703bsalomon 1195273c0f5e87397c40d22bb7e3ee078bb46a3f6860bsalomonclass DebugGLContext : public sk_gpu_test::GLTestContext { 11963724e574a744491b7cfb8187ac865a70ef3d4528bsalomonpublic: 11973724e574a744491b7cfb8187ac865a70ef3d4528bsalomon DebugGLContext() { 11983724e574a744491b7cfb8187ac865a70ef3d4528bsalomon this->init(new DebugInterface()); 11993724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 1200fe3456cb006110d045b26ff3f8681b893a757b58bsalomon 12013724e574a744491b7cfb8187ac865a70ef3d4528bsalomon ~DebugGLContext() override { this->teardown(); } 12026f70d43719d0583d486a000f66e915c10a6b83a2robertphillips 12033724e574a744491b7cfb8187ac865a70ef3d4528bsalomonprivate: 12043724e574a744491b7cfb8187ac865a70ef3d4528bsalomon void onPlatformMakeCurrent() const override {} 12053724e574a744491b7cfb8187ac865a70ef3d4528bsalomon void onPlatformSwapBuffers() const override {} 12063724e574a744491b7cfb8187ac865a70ef3d4528bsalomon GrGLFuncPtr onPlatformGetProcAddress(const char*) const override { return nullptr; } 12073724e574a744491b7cfb8187ac865a70ef3d4528bsalomon}; 12083724e574a744491b7cfb8187ac865a70ef3d4528bsalomon} // anonymous namespace 12093724e574a744491b7cfb8187ac865a70ef3d4528bsalomon 12103724e574a744491b7cfb8187ac865a70ef3d4528bsalomonnamespace sk_gpu_test { 121160c774db3ec46f3eb85f6390ba31e38c8d29e2d4Brian OsmanGLTestContext* CreateDebugGLTestContext(GLTestContext* shareContext) { 121260c774db3ec46f3eb85f6390ba31e38c8d29e2d4Brian Osman if (shareContext) { 121360c774db3ec46f3eb85f6390ba31e38c8d29e2d4Brian Osman return nullptr; 121460c774db3ec46f3eb85f6390ba31e38c8d29e2d4Brian Osman } 1215273c0f5e87397c40d22bb7e3ee078bb46a3f6860bsalomon GLTestContext* ctx = new DebugGLContext(); 12163724e574a744491b7cfb8187ac865a70ef3d4528bsalomon if (ctx->isValid()) { 12173724e574a744491b7cfb8187ac865a70ef3d4528bsalomon return ctx; 12183724e574a744491b7cfb8187ac865a70ef3d4528bsalomon } 12193724e574a744491b7cfb8187ac865a70ef3d4528bsalomon delete ctx; 12203724e574a744491b7cfb8187ac865a70ef3d4528bsalomon return nullptr; 12213724e574a744491b7cfb8187ac865a70ef3d4528bsalomon} 12223724e574a744491b7cfb8187ac865a70ef3d4528bsalomon} 1223