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