| Index: src/gpu/gl/GrGLCreateNullInterface.cpp
|
| diff --git a/src/gpu/gl/GrGLCreateNullInterface.cpp b/src/gpu/gl/GrGLCreateNullInterface.cpp
|
| index dd48bd8f0f87939ad6d9310a26debe33801f2a3b..ccaab598b87db5733b4117087e0bb6704d99dd88 100644
|
| --- a/src/gpu/gl/GrGLCreateNullInterface.cpp
|
| +++ b/src/gpu/gl/GrGLCreateNullInterface.cpp
|
| @@ -7,12 +7,9 @@
|
|
|
|
|
| #include "gl/GrGLInterface.h"
|
| -#include "GrGLDefines.h"
|
| +#include "GrGLTestInterface.h"
|
| +#include "SkMutex.h"
|
| #include "SkTDArray.h"
|
| -#include "GrGLNoOpInterface.h"
|
| -#include "SkTLS.h"
|
| -
|
| -// TODO: Delete this file after chrome starts using SkNullGLContext.
|
|
|
| // added to suppress 'no previous prototype' warning and because this code is duplicated in
|
| // SkNullGLContext.cpp
|
| @@ -20,10 +17,7 @@ namespace {
|
|
|
| class BufferObj {
|
| public:
|
| -
|
| -
|
| - BufferObj(GrGLuint id) : fID(id), fDataPtr(nullptr), fSize(0), fMapped(false) {
|
| - }
|
| + BufferObj(GrGLuint id) : fID(id), fDataPtr(nullptr), fSize(0), fMapped(false) {}
|
| ~BufferObj() { delete[] fDataPtr; }
|
|
|
| void allocate(GrGLsizeiptr size, const GrGLchar* dataPtr) {
|
| @@ -53,8 +47,6 @@ private:
|
| // This class maintains a sparsely populated array of buffer pointers.
|
| class BufferManager {
|
| public:
|
| -
|
| -
|
| BufferManager() : fFreeListHead(kFreeListEnd) {}
|
|
|
| ~BufferManager() {
|
| @@ -114,383 +106,509 @@ private:
|
| SkTDArray<BufferObj*> fBuffers;
|
| };
|
|
|
| -/**
|
| - * The global-to-thread state object for the null interface. All null interfaces on the
|
| - * same thread currently share one of these. This means two null contexts on the same thread
|
| - * can interfere with each other. It may make sense to more integrate this into SkNullGLContext
|
| - * and use it's makeCurrent mechanism.
|
| - */
|
| -struct ThreadContext {
|
| +/** Null interface implementation */
|
| +class NullInterface : public GrGLTestInterface {
|
| public:
|
| -
|
| + NullInterface()
|
| + : fCurrArrayBuffer(0)
|
| + , fCurrElementArrayBuffer(0)
|
| + , fCurrPixelPackBuffer(0)
|
| + , fCurrPixelUnpackBuffer(0)
|
| + , fCurrShaderID(0)
|
| + , fCurrGenericID(0)
|
| + , fCurrUniformLocation(0) {
|
| + this->init(kGL_GrGLStandard);
|
| + }
|
| +
|
| + GrGLenum checkFramebufferStatus(GrGLenum target) override {
|
| + return GR_GL_FRAMEBUFFER_COMPLETE;
|
| + }
|
| +
|
| + GrGLvoid genBuffers(GrGLsizei n, GrGLuint* ids) override {
|
| + for (int i = 0; i < n; ++i) {
|
| + BufferObj* buffer = fBufferManager.create();
|
| + ids[i] = buffer->id();
|
| + }
|
| + }
|
| +
|
| + GrGLvoid bufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data,
|
| + GrGLenum usage) override {
|
| + GrGLuint id = 0;
|
| +
|
| + switch (target) {
|
| + case GR_GL_ARRAY_BUFFER:
|
| + id = fCurrArrayBuffer;
|
| + break;
|
| + case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| + id = fCurrElementArrayBuffer;
|
| + break;
|
| + case GR_GL_PIXEL_PACK_BUFFER:
|
| + id = fCurrPixelPackBuffer;
|
| + break;
|
| + case GR_GL_PIXEL_UNPACK_BUFFER:
|
| + id = fCurrPixelUnpackBuffer;
|
| + break;
|
| + default:
|
| + SkFAIL("Unexpected target to nullGLBufferData");
|
| + break;
|
| + }
|
| +
|
| + if (id > 0) {
|
| + BufferObj* buffer = fBufferManager.lookUp(id);
|
| + buffer->allocate(size, (const GrGLchar*) data);
|
| + }
|
| + }
|
| +
|
| + GrGLuint createProgram() override {
|
| + return ++fCurrProgramID;
|
| + }
|
| +
|
| + GrGLuint createShader(GrGLenum type) override {
|
| + return ++fCurrShaderID;
|
| + }
|
| +
|
| + GrGLvoid bindBuffer(GrGLenum target, GrGLuint buffer) override {
|
| + switch (target) {
|
| + case GR_GL_ARRAY_BUFFER:
|
| + fCurrArrayBuffer = buffer;
|
| + break;
|
| + case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| + fCurrElementArrayBuffer = buffer;
|
| + break;
|
| + case GR_GL_PIXEL_PACK_BUFFER:
|
| + fCurrPixelPackBuffer = buffer;
|
| + break;
|
| + case GR_GL_PIXEL_UNPACK_BUFFER:
|
| + fCurrPixelUnpackBuffer = buffer;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + // deleting a bound buffer has the side effect of binding 0
|
| + GrGLvoid deleteBuffers(GrGLsizei n, const GrGLuint* ids) override {
|
| + for (int i = 0; i < n; ++i) {
|
| + if (ids[i] == fCurrArrayBuffer) {
|
| + fCurrArrayBuffer = 0;
|
| + }
|
| + if (ids[i] == fCurrElementArrayBuffer) {
|
| + fCurrElementArrayBuffer = 0;
|
| + }
|
| + if (ids[i] == fCurrPixelPackBuffer) {
|
| + fCurrPixelPackBuffer = 0;
|
| + }
|
| + if (ids[i] == fCurrPixelUnpackBuffer) {
|
| + fCurrPixelUnpackBuffer = 0;
|
| + }
|
| +
|
| + BufferObj* buffer = fBufferManager.lookUp(ids[i]);
|
| + fBufferManager.free(buffer);
|
| + }
|
| + }
|
| +
|
| + GrGLvoid genFramebuffers(GrGLsizei n, GrGLuint *framebuffers) override {
|
| + this->genGenericIds(n, framebuffers);
|
| + }
|
| +
|
| + GrGLvoid genQueries(GrGLsizei n, GrGLuint *ids) override { this->genGenericIds(n, ids); }
|
| +
|
| + GrGLvoid genRenderbuffers(GrGLsizei n, GrGLuint *renderbuffers) override {
|
| + this->genGenericIds(n, renderbuffers);
|
| + }
|
| +
|
| + GrGLvoid genTextures(GrGLsizei n, GrGLuint *textures) override {
|
| + this->genGenericIds(n, textures);
|
| + }
|
| +
|
| + GrGLvoid genVertexArrays(GrGLsizei n, GrGLuint *arrays) override {
|
| + this->genGenericIds(n, arrays);
|
| + }
|
| +
|
| + GrGLenum getError() override { return GR_GL_NO_ERROR; }
|
| +
|
| + GrGLvoid getIntegerv(GrGLenum pname, GrGLint* params) override {
|
| + // TODO: remove from Ganesh the #defines for gets we don't use.
|
| + // We would like to minimize gets overall due to performance issues
|
| + switch (pname) {
|
| + case GR_GL_CONTEXT_PROFILE_MASK:
|
| + *params = GR_GL_CONTEXT_COMPATIBILITY_PROFILE_BIT;
|
| + break;
|
| + case GR_GL_STENCIL_BITS:
|
| + *params = 8;
|
| + break;
|
| + case GR_GL_SAMPLES:
|
| + *params = 1;
|
| + break;
|
| + case GR_GL_FRAMEBUFFER_BINDING:
|
| + *params = 0;
|
| + break;
|
| + case GR_GL_VIEWPORT:
|
| + params[0] = 0;
|
| + params[1] = 0;
|
| + params[2] = 800;
|
| + params[3] = 600;
|
| + break;
|
| + case GR_GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
|
| + case GR_GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS:
|
| + case GR_GL_MAX_TEXTURE_IMAGE_UNITS:
|
| + case GR_GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
|
| + *params = 8;
|
| + break;
|
| + case GR_GL_MAX_TEXTURE_COORDS:
|
| + *params = 8;
|
| + break;
|
| + case GR_GL_MAX_VERTEX_UNIFORM_VECTORS:
|
| + *params = kDefaultMaxVertexUniformVectors;
|
| + break;
|
| + case GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS:
|
| + *params = kDefaultMaxFragmentUniformVectors;
|
| + break;
|
| + case GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
|
| + *params = 16 * 4;
|
| + break;
|
| + case GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS:
|
| + *params = 0;
|
| + break;
|
| + case GR_GL_COMPRESSED_TEXTURE_FORMATS:
|
| + break;
|
| + case GR_GL_MAX_TEXTURE_SIZE:
|
| + *params = 8192;
|
| + break;
|
| + case GR_GL_MAX_RENDERBUFFER_SIZE:
|
| + *params = 8192;
|
| + break;
|
| + case GR_GL_MAX_SAMPLES:
|
| + *params = 32;
|
| + break;
|
| + case GR_GL_MAX_VERTEX_ATTRIBS:
|
| + *params = kDefaultMaxVertexAttribs;
|
| + break;
|
| + case GR_GL_MAX_VARYING_VECTORS:
|
| + *params = kDefaultMaxVaryingVectors;
|
| + break;
|
| + case GR_GL_NUM_EXTENSIONS: {
|
| + GrGLint i = 0;
|
| + while (kExtensions[i++]);
|
| + *params = i;
|
| + break;
|
| + }
|
| + default:
|
| + SkFAIL("Unexpected pname to GetIntegerv");
|
| + }
|
| + }
|
| +
|
| + GrGLvoid getProgramiv(GrGLuint program, GrGLenum pname, GrGLint* params) override {
|
| + this->getShaderOrProgramiv(program, pname, params);
|
| + }
|
| +
|
| + GrGLvoid getProgramInfoLog(GrGLuint program, GrGLsizei bufsize, GrGLsizei* length,
|
| + char* infolog) override {
|
| + this->getInfoLog(program, bufsize, length, infolog);
|
| + }
|
| +
|
| + GrGLvoid getMultisamplefv(GrGLenum pname, GrGLuint index, GrGLfloat* val) override {
|
| + val[0] = val[1] = 0.5f;
|
| + }
|
| +
|
| + GrGLvoid getQueryiv(GrGLenum GLtarget, GrGLenum pname, GrGLint *params) override {
|
| + switch (pname) {
|
| + case GR_GL_CURRENT_QUERY:
|
| + *params = 0;
|
| + break;
|
| + case GR_GL_QUERY_COUNTER_BITS:
|
| + *params = 32;
|
| + break;
|
| + default:
|
| + SkFAIL("Unexpected pname passed GetQueryiv.");
|
| + }
|
| + }
|
| +
|
| + GrGLvoid getQueryObjecti64v(GrGLuint id, GrGLenum pname, GrGLint64 *params) override {
|
| + queryResult(id, pname, params);
|
| + }
|
| +
|
| + GrGLvoid getQueryObjectiv(GrGLuint id, GrGLenum pname, GrGLint *params) override {
|
| + queryResult(id, pname, params);
|
| + }
|
| +
|
| + GrGLvoid getQueryObjectui64v(GrGLuint id, GrGLenum pname, GrGLuint64 *params) override {
|
| + queryResult(id, pname, params);
|
| + }
|
| +
|
| + GrGLvoid getQueryObjectuiv(GrGLuint id, GrGLenum pname, GrGLuint *params) override {
|
| + queryResult(id, pname, params);
|
| + }
|
|
|
| + GrGLvoid getShaderiv(GrGLuint shader, GrGLenum pname, GrGLint* params) override {
|
| + this->getShaderOrProgramiv(shader, pname, params);
|
| + }
|
| +
|
| + GrGLvoid getShaderInfoLog(GrGLuint shader, GrGLsizei bufsize, GrGLsizei* length,
|
| + char* infolog) override {
|
| + this->getInfoLog(shader, bufsize, length, infolog);
|
| + }
|
| +
|
| + const GrGLubyte* getString(GrGLenum name) override {
|
| + switch (name) {
|
| + case GR_GL_EXTENSIONS:
|
| + return CombinedExtensionString();
|
| + case GR_GL_VERSION:
|
| + return (const GrGLubyte*)"4.0 Debug GL";
|
| + case GR_GL_SHADING_LANGUAGE_VERSION:
|
| + return (const GrGLubyte*)"4.20.8 Debug GLSL";
|
| + case GR_GL_VENDOR:
|
| + return (const GrGLubyte*)"Debug Vendor";
|
| + case GR_GL_RENDERER:
|
| + return (const GrGLubyte*)"The Debug (Non-)Renderer";
|
| + default:
|
| + SkFAIL("Unexpected name passed to GetString");
|
| + return nullptr;
|
| + }
|
| + }
|
| +
|
| + const GrGLubyte* getStringi(GrGLenum name, GrGLuint i) override {
|
| + switch (name) {
|
| + case GR_GL_EXTENSIONS: {
|
| + GrGLint count;
|
| + this->getIntegerv(GR_GL_NUM_EXTENSIONS, &count);
|
| + if ((GrGLint)i <= count) {
|
| + return (const GrGLubyte*) kExtensions[i];
|
| + } else {
|
| + return nullptr;
|
| + }
|
| + }
|
| + default:
|
| + SkFAIL("Unexpected name passed to GetStringi");
|
| + return nullptr;
|
| + }
|
| + }
|
| +
|
| + GrGLvoid getTexLevelParameteriv(GrGLenum target, GrGLint level, GrGLenum pname,
|
| + GrGLint* params) override {
|
| + // we used to use this to query stuff about externally created textures,
|
| + // now we just require clients to tell us everything about the texture.
|
| + SkFAIL("Should never query texture parameters.");
|
| + }
|
| +
|
| + GrGLint getUniformLocation(GrGLuint program, const char* name) override {
|
| + return ++fCurrUniformLocation;
|
| + }
|
| +
|
| + GrGLvoid* mapBufferRange(GrGLenum target, GrGLintptr offset, GrGLsizeiptr length,
|
| + GrGLbitfield access) override {
|
| + GrGLuint id = 0;
|
| + switch (target) {
|
| + case GR_GL_ARRAY_BUFFER:
|
| + id = fCurrArrayBuffer;
|
| + break;
|
| + case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| + id = fCurrElementArrayBuffer;
|
| + break;
|
| + case GR_GL_PIXEL_PACK_BUFFER:
|
| + id = fCurrPixelPackBuffer;
|
| + break;
|
| + case GR_GL_PIXEL_UNPACK_BUFFER:
|
| + id = fCurrPixelUnpackBuffer;
|
| + break;
|
| + }
|
| +
|
| + if (id > 0) {
|
| + // We just ignore the offset and length here.
|
| + BufferObj* buffer = fBufferManager.lookUp(id);
|
| + SkASSERT(!buffer->mapped());
|
| + buffer->setMapped(true);
|
| + return buffer->dataPtr();
|
| + }
|
| + return nullptr;
|
| + }
|
| +
|
| + GrGLvoid* mapBuffer(GrGLenum target, GrGLenum access) override {
|
| + GrGLuint id = 0;
|
| + switch (target) {
|
| + case GR_GL_ARRAY_BUFFER:
|
| + id = fCurrArrayBuffer;
|
| + break;
|
| + case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| + id = fCurrElementArrayBuffer;
|
| + break;
|
| + case GR_GL_PIXEL_PACK_BUFFER:
|
| + id = fCurrPixelPackBuffer;
|
| + break;
|
| + case GR_GL_PIXEL_UNPACK_BUFFER:
|
| + id = fCurrPixelUnpackBuffer;
|
| + break;
|
| + }
|
| +
|
| + if (id > 0) {
|
| + BufferObj* buffer = fBufferManager.lookUp(id);
|
| + SkASSERT(!buffer->mapped());
|
| + buffer->setMapped(true);
|
| + return buffer->dataPtr();
|
| + }
|
| +
|
| + SkASSERT(false);
|
| + return nullptr; // no buffer bound to target
|
| + }
|
| +
|
| + GrGLboolean unmapBuffer(GrGLenum target) override {
|
| + GrGLuint id = 0;
|
| + switch (target) {
|
| + case GR_GL_ARRAY_BUFFER:
|
| + id = fCurrArrayBuffer;
|
| + break;
|
| + case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| + id = fCurrElementArrayBuffer;
|
| + break;
|
| + case GR_GL_PIXEL_PACK_BUFFER:
|
| + id = fCurrPixelPackBuffer;
|
| + break;
|
| + case GR_GL_PIXEL_UNPACK_BUFFER:
|
| + id = fCurrPixelUnpackBuffer;
|
| + break;
|
| + }
|
| + if (id > 0) {
|
| + BufferObj* buffer = fBufferManager.lookUp(id);
|
| + SkASSERT(buffer->mapped());
|
| + buffer->setMapped(false);
|
| + return GR_GL_TRUE;
|
| + }
|
| +
|
| + GrAlwaysAssert(false);
|
| + return GR_GL_FALSE; // GR_GL_INVALID_OPERATION;
|
| + }
|
| +
|
| + GrGLvoid getBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) override {
|
| + switch (pname) {
|
| + case GR_GL_BUFFER_MAPPED: {
|
| + *params = GR_GL_FALSE;
|
| + GrGLuint id = 0;
|
| + switch (target) {
|
| + case GR_GL_ARRAY_BUFFER:
|
| + id = fCurrArrayBuffer;
|
| + break;
|
| + case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| + id = fCurrElementArrayBuffer;
|
| + break;
|
| + case GR_GL_PIXEL_PACK_BUFFER:
|
| + id = fCurrPixelPackBuffer;
|
| + break;
|
| + case GR_GL_PIXEL_UNPACK_BUFFER:
|
| + id = fCurrPixelUnpackBuffer;
|
| + break;
|
| + }
|
| + if (id > 0) {
|
| + BufferObj* buffer = fBufferManager.lookUp(id);
|
| + if (buffer->mapped()) {
|
| + *params = GR_GL_TRUE;
|
| + }
|
| + }
|
| + break; }
|
| + default:
|
| + SkFAIL("Unexpected pname to GetBufferParamateriv");
|
| + break;
|
| + }
|
| + };
|
| +
|
| +private:
|
| BufferManager fBufferManager;
|
| GrGLuint fCurrArrayBuffer;
|
| GrGLuint fCurrElementArrayBuffer;
|
| + GrGLuint fCurrPixelPackBuffer;
|
| + GrGLuint fCurrPixelUnpackBuffer;
|
| GrGLuint fCurrProgramID;
|
| GrGLuint fCurrShaderID;
|
| + GrGLuint fCurrGenericID;
|
| + GrGLuint fCurrUniformLocation;
|
|
|
| - static ThreadContext* Get() {
|
| - return reinterpret_cast<ThreadContext*>(SkTLS::Get(Create, Delete));
|
| - }
|
| + // the OpenGLES 2.0 spec says this must be >= 128
|
| + static const GrGLint kDefaultMaxVertexUniformVectors = 128;
|
|
|
| - ThreadContext()
|
| - : fCurrArrayBuffer(0)
|
| - , fCurrElementArrayBuffer(0)
|
| - , fCurrProgramID(0)
|
| - , fCurrShaderID(0) {}
|
| + // the OpenGLES 2.0 spec says this must be >=16
|
| + static const GrGLint kDefaultMaxFragmentUniformVectors = 16;
|
|
|
| -private:
|
| - static void* Create() { return new ThreadContext; }
|
| - static void Delete(void* context) { delete reinterpret_cast<ThreadContext*>(context); }
|
| -};
|
| + // the OpenGLES 2.0 spec says this must be >= 8
|
| + static const GrGLint kDefaultMaxVertexAttribs = 8;
|
|
|
| -// Functions not declared in GrGLBogusInterface.h (not common with the Debug GL interface).
|
| -
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shader) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindVertexArray(GrGLuint id) {}
|
| -
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLGenBuffers(GrGLsizei n, GrGLuint* ids) {
|
| - ThreadContext* ctx = ThreadContext::Get();
|
| - for (int i = 0; i < n; ++i) {
|
| - BufferObj* buffer = ctx->fBufferManager.create();
|
| - ids[i] = buffer->id();
|
| - }
|
| -}
|
| -
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLGenerateMipmap(GrGLenum target) {}
|
| -
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target,
|
| - GrGLsizeiptr size,
|
| - const GrGLvoid* data,
|
| - GrGLenum usage) {
|
| - ThreadContext* ctx = ThreadContext::Get();
|
| - GrGLuint id = 0;
|
| -
|
| - switch (target) {
|
| - case GR_GL_ARRAY_BUFFER:
|
| - id = ctx->fCurrArrayBuffer;
|
| - break;
|
| - case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| - id = ctx->fCurrElementArrayBuffer;
|
| - break;
|
| - default:
|
| - SkFAIL("Unexpected target to nullGLBufferData");
|
| - break;
|
| - }
|
| -
|
| - if (id > 0) {
|
| - BufferObj* buffer = ctx->fBufferManager.lookUp(id);
|
| - buffer->allocate(size, (const GrGLchar*) data);
|
| - }
|
| -}
|
| -
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint framebuffer) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint renderbuffer) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuint *framebuffers) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLuint *renderbuffers) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {}
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {}
|
| -
|
| -GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() {
|
| - return ++ThreadContext::Get()->fCurrProgramID;
|
| -}
|
| -
|
| -GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) {
|
| - return ++ThreadContext::Get()->fCurrShaderID;
|
| -}
|
| -
|
| -// same delete used for shaders and programs
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) {
|
| -}
|
| -
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) {
|
| - ThreadContext* ctx = ThreadContext::Get();
|
| - switch (target) {
|
| - case GR_GL_ARRAY_BUFFER:
|
| - ctx->fCurrArrayBuffer = buffer;
|
| - break;
|
| - case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| - ctx->fCurrElementArrayBuffer = buffer;
|
| - break;
|
| - }
|
| -}
|
| -
|
| -// deleting a bound buffer has the side effect of binding 0
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* ids) {
|
| - ThreadContext* ctx = ThreadContext::Get();
|
| - for (int i = 0; i < n; ++i) {
|
| - if (ids[i] == ctx->fCurrArrayBuffer) {
|
| - ctx->fCurrArrayBuffer = 0;
|
| - }
|
| - if (ids[i] == ctx->fCurrElementArrayBuffer) {
|
| - ctx->fCurrElementArrayBuffer = 0;
|
| - }
|
| + // the OpenGLES 2.0 spec says this must be >= 8
|
| + static const GrGLint kDefaultMaxVaryingVectors = 8;
|
|
|
| - BufferObj* buffer = ctx->fBufferManager.lookUp(ids[i]);
|
| - ctx->fBufferManager.free(buffer);
|
| - }
|
| -}
|
| -
|
| -GrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBufferRange(GrGLenum target, GrGLintptr offset,
|
| - GrGLsizeiptr length, GrGLbitfield access) {
|
| - ThreadContext* ctx = ThreadContext::Get();
|
| - GrGLuint id = 0;
|
| - switch (target) {
|
| - case GR_GL_ARRAY_BUFFER:
|
| - id = ctx->fCurrArrayBuffer;
|
| - break;
|
| - case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| - id = ctx->fCurrElementArrayBuffer;
|
| - break;
|
| - }
|
| -
|
| - if (id > 0) {
|
| - // We just ignore the offset and length here.
|
| - BufferObj* buffer = ctx->fBufferManager.lookUp(id);
|
| - SkASSERT(!buffer->mapped());
|
| - buffer->setMapped(true);
|
| - return buffer->dataPtr();
|
| - }
|
| - return nullptr;
|
| -}
|
| -
|
| -GrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) {
|
| - ThreadContext* ctx = ThreadContext::Get();
|
| - GrGLuint id = 0;
|
| - switch (target) {
|
| - case GR_GL_ARRAY_BUFFER:
|
| - id = ctx->fCurrArrayBuffer;
|
| - break;
|
| - case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| - id = ctx->fCurrElementArrayBuffer;
|
| - break;
|
| - }
|
| -
|
| - if (id > 0) {
|
| - BufferObj* buffer = ctx->fBufferManager.lookUp(id);
|
| - SkASSERT(!buffer->mapped());
|
| - buffer->setMapped(true);
|
| - return buffer->dataPtr();
|
| - }
|
| -
|
| - SkASSERT(false);
|
| - return nullptr; // no buffer bound to target
|
| -}
|
| -
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLFlushMappedBufferRange(GrGLenum target,
|
| - GrGLintptr offset,
|
| - GrGLsizeiptr length) {}
|
| -
|
| -
|
| -GrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) {
|
| - ThreadContext* ctx = ThreadContext::Get();
|
| - GrGLuint id = 0;
|
| - switch (target) {
|
| - case GR_GL_ARRAY_BUFFER:
|
| - id = ctx->fCurrArrayBuffer;
|
| - break;
|
| - case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| - id = ctx->fCurrElementArrayBuffer;
|
| - break;
|
| - }
|
| - if (id > 0) {
|
| - BufferObj* buffer = ctx->fBufferManager.lookUp(id);
|
| - SkASSERT(buffer->mapped());
|
| - buffer->setMapped(false);
|
| - return GR_GL_TRUE;
|
| - }
|
| -
|
| - GrAlwaysAssert(false);
|
| - return GR_GL_FALSE; // GR_GL_INVALID_OPERATION;
|
| -}
|
| -
|
| -GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) {
|
| - ThreadContext* ctx = ThreadContext::Get();
|
| - switch (pname) {
|
| - case GR_GL_BUFFER_MAPPED: {
|
| - *params = GR_GL_FALSE;
|
| - GrGLuint id = 0;
|
| - switch (target) {
|
| - case GR_GL_ARRAY_BUFFER:
|
| - id = ctx->fCurrArrayBuffer;
|
| - break;
|
| - case GR_GL_ELEMENT_ARRAY_BUFFER:
|
| - id = ctx->fCurrElementArrayBuffer;
|
| - break;
|
| - }
|
| - if (id > 0) {
|
| - BufferObj* buffer = ctx->fBufferManager.lookUp(id);
|
| - if (buffer->mapped()) {
|
| - *params = GR_GL_TRUE;
|
| + static const char* kExtensions[];
|
| +
|
| + static const GrGLubyte* CombinedExtensionString() {
|
| + static SkString gExtString;
|
| + static SkMutex gMutex;
|
| + gMutex.acquire();
|
| + if (0 == gExtString.size()) {
|
| + int i = 0;
|
| + while (kExtensions[i]) {
|
| + if (i > 0) {
|
| + gExtString.append(" ");
|
| }
|
| + gExtString.append(kExtensions[i]);
|
| + ++i;
|
| }
|
| - break; }
|
| - default:
|
| - SkFAIL("Unexpected pname to GetBufferParamateriv");
|
| - break;
|
| + }
|
| + gMutex.release();
|
| + return (const GrGLubyte*) gExtString.c_str();
|
| + }
|
| +
|
| + GrGLvoid genGenericIds(GrGLsizei n, GrGLuint* ids) {
|
| + for (int i = 0; i < n; ++i) {
|
| + ids[i] = ++fCurrGenericID;
|
| + }
|
| + }
|
| +
|
| + GrGLvoid getInfoLog(GrGLuint object, GrGLsizei bufsize, GrGLsizei* length,
|
| + char* infolog) {
|
| + if (length) {
|
| + *length = 0;
|
| + }
|
| + if (bufsize > 0) {
|
| + *infolog = 0;
|
| + }
|
| + }
|
| +
|
| + GrGLvoid getShaderOrProgramiv(GrGLuint object, GrGLenum pname, GrGLint* params) {
|
| + switch (pname) {
|
| + case GR_GL_LINK_STATUS: // fallthru
|
| + case GR_GL_COMPILE_STATUS:
|
| + *params = GR_GL_TRUE;
|
| + break;
|
| + case GR_GL_INFO_LOG_LENGTH:
|
| + *params = 0;
|
| + break;
|
| + // we don't expect any other pnames
|
| + default:
|
| + SkFAIL("Unexpected pname to GetProgramiv");
|
| + break;
|
| + }
|
| + }
|
| +
|
| + template <typename T>
|
| + void queryResult(GrGLenum GLtarget, GrGLenum pname, T *params) {
|
| + switch (pname) {
|
| + case GR_GL_QUERY_RESULT_AVAILABLE:
|
| + *params = GR_GL_TRUE;
|
| + break;
|
| + case GR_GL_QUERY_RESULT:
|
| + *params = 0;
|
| + break;
|
| + default:
|
| + SkFAIL("Unexpected pname passed to GetQueryObject.");
|
| + break;
|
| + }
|
| }
|
| };
|
|
|
| -} // end anonymous namespace
|
| -
|
| -const GrGLInterface* GrGLCreateNullInterface() {
|
| - GrGLInterface* interface = new GrGLInterface;
|
| -
|
| - interface->fStandard = kGL_GrGLStandard;
|
| -
|
| - GrGLInterface::Functions* functions = &interface->fFunctions;
|
| - functions->fActiveTexture = nullGLActiveTexture;
|
| - functions->fAttachShader = nullGLAttachShader;
|
| - functions->fBeginQuery = nullGLBeginQuery;
|
| - functions->fBindAttribLocation = nullGLBindAttribLocation;
|
| - functions->fBindBuffer = nullGLBindBuffer;
|
| - functions->fBindFragDataLocation = noOpGLBindFragDataLocation;
|
| - functions->fBindTexture = nullGLBindTexture;
|
| - functions->fBindVertexArray = nullGLBindVertexArray;
|
| - functions->fBlendColor = noOpGLBlendColor;
|
| - functions->fBlendEquation = noOpGLBlendEquation;
|
| - functions->fBlendFunc = noOpGLBlendFunc;
|
| - functions->fBufferData = nullGLBufferData;
|
| - functions->fBufferSubData = noOpGLBufferSubData;
|
| - functions->fClear = noOpGLClear;
|
| - functions->fClearColor = noOpGLClearColor;
|
| - functions->fClearStencil = noOpGLClearStencil;
|
| - functions->fColorMask = noOpGLColorMask;
|
| - functions->fCompileShader = noOpGLCompileShader;
|
| - functions->fCompressedTexImage2D = noOpGLCompressedTexImage2D;
|
| - functions->fCompressedTexSubImage2D = noOpGLCompressedTexSubImage2D;
|
| - functions->fCopyTexSubImage2D = noOpGLCopyTexSubImage2D;
|
| - functions->fCreateProgram = nullGLCreateProgram;
|
| - functions->fCreateShader = nullGLCreateShader;
|
| - functions->fCullFace = noOpGLCullFace;
|
| - functions->fDeleteBuffers = nullGLDeleteBuffers;
|
| - functions->fDeleteProgram = nullGLDelete;
|
| - functions->fDeleteQueries = noOpGLDeleteIds;
|
| - functions->fDeleteShader = nullGLDelete;
|
| - functions->fDeleteTextures = noOpGLDeleteIds;
|
| - functions->fDeleteVertexArrays = noOpGLDeleteIds;
|
| - functions->fDepthMask = noOpGLDepthMask;
|
| - functions->fDisable = noOpGLDisable;
|
| - functions->fDisableVertexAttribArray = noOpGLDisableVertexAttribArray;
|
| - functions->fDrawArrays = noOpGLDrawArrays;
|
| - functions->fDrawArraysInstanced = noOpGLDrawArraysInstanced;
|
| - functions->fDrawBuffer = noOpGLDrawBuffer;
|
| - functions->fDrawBuffers = noOpGLDrawBuffers;
|
| - functions->fDrawElements = noOpGLDrawElements;
|
| - functions->fDrawElementsInstanced = noOpGLDrawElementsInstanced;
|
| - functions->fEnable = noOpGLEnable;
|
| - functions->fEnableVertexAttribArray = noOpGLEnableVertexAttribArray;
|
| - functions->fEndQuery = noOpGLEndQuery;
|
| - functions->fFinish = noOpGLFinish;
|
| - functions->fFlush = noOpGLFlush;
|
| - functions->fFlushMappedBufferRange = nullGLFlushMappedBufferRange;
|
| - functions->fFrontFace = noOpGLFrontFace;
|
| - functions->fGenBuffers = nullGLGenBuffers;
|
| - functions->fGenerateMipmap = nullGLGenerateMipmap;
|
| - functions->fGenQueries = noOpGLGenIds;
|
| - functions->fGenTextures = noOpGLGenIds;
|
| - functions->fGenVertexArrays = noOpGLGenIds;
|
| - functions->fGetBufferParameteriv = nullGLGetBufferParameteriv;
|
| - functions->fGetError = noOpGLGetError;
|
| - functions->fGetIntegerv = noOpGLGetIntegerv;
|
| - functions->fGetMultisamplefv = noOpGLGetMultisamplefv;
|
| - functions->fGetQueryObjecti64v = noOpGLGetQueryObjecti64v;
|
| - functions->fGetQueryObjectiv = noOpGLGetQueryObjectiv;
|
| - functions->fGetQueryObjectui64v = noOpGLGetQueryObjectui64v;
|
| - functions->fGetQueryObjectuiv = noOpGLGetQueryObjectuiv;
|
| - functions->fGetQueryiv = noOpGLGetQueryiv;
|
| - functions->fGetProgramInfoLog = noOpGLGetInfoLog;
|
| - functions->fGetProgramiv = noOpGLGetShaderOrProgramiv;
|
| - functions->fGetShaderInfoLog = noOpGLGetInfoLog;
|
| - functions->fGetShaderiv = noOpGLGetShaderOrProgramiv;
|
| - functions->fGetString = noOpGLGetString;
|
| - functions->fGetStringi = noOpGLGetStringi;
|
| - functions->fGetTexLevelParameteriv = noOpGLGetTexLevelParameteriv;
|
| - functions->fGetUniformLocation = noOpGLGetUniformLocation;
|
| - functions->fInsertEventMarker = noOpGLInsertEventMarker;
|
| - functions->fLineWidth = noOpGLLineWidth;
|
| - functions->fLinkProgram = noOpGLLinkProgram;
|
| - functions->fMapBuffer = nullGLMapBuffer;
|
| - functions->fMapBufferRange = nullGLMapBufferRange;
|
| - functions->fPixelStorei = nullGLPixelStorei;
|
| - functions->fPopGroupMarker = noOpGLPopGroupMarker;
|
| - functions->fPushGroupMarker = noOpGLPushGroupMarker;
|
| - functions->fQueryCounter = noOpGLQueryCounter;
|
| - functions->fReadBuffer = noOpGLReadBuffer;
|
| - functions->fReadPixels = nullGLReadPixels;
|
| - functions->fScissor = noOpGLScissor;
|
| - functions->fShaderSource = noOpGLShaderSource;
|
| - functions->fStencilFunc = noOpGLStencilFunc;
|
| - functions->fStencilFuncSeparate = noOpGLStencilFuncSeparate;
|
| - functions->fStencilMask = noOpGLStencilMask;
|
| - functions->fStencilMaskSeparate = noOpGLStencilMaskSeparate;
|
| - functions->fStencilOp = noOpGLStencilOp;
|
| - functions->fStencilOpSeparate = noOpGLStencilOpSeparate;
|
| - functions->fTexBuffer = noOpGLTexBuffer;
|
| - functions->fTexImage2D = noOpGLTexImage2D;
|
| - functions->fTexParameteri = noOpGLTexParameteri;
|
| - functions->fTexParameteriv = noOpGLTexParameteriv;
|
| - functions->fTexSubImage2D = noOpGLTexSubImage2D;
|
| - functions->fTexStorage2D = noOpGLTexStorage2D;
|
| - functions->fDiscardFramebuffer = noOpGLDiscardFramebuffer;
|
| - functions->fUniform1f = noOpGLUniform1f;
|
| - functions->fUniform1i = noOpGLUniform1i;
|
| - functions->fUniform1fv = noOpGLUniform1fv;
|
| - functions->fUniform1iv = noOpGLUniform1iv;
|
| - functions->fUniform2f = noOpGLUniform2f;
|
| - functions->fUniform2i = noOpGLUniform2i;
|
| - functions->fUniform2fv = noOpGLUniform2fv;
|
| - functions->fUniform2iv = noOpGLUniform2iv;
|
| - functions->fUniform3f = noOpGLUniform3f;
|
| - functions->fUniform3i = noOpGLUniform3i;
|
| - functions->fUniform3fv = noOpGLUniform3fv;
|
| - functions->fUniform3iv = noOpGLUniform3iv;
|
| - functions->fUniform4f = noOpGLUniform4f;
|
| - functions->fUniform4i = noOpGLUniform4i;
|
| - functions->fUniform4fv = noOpGLUniform4fv;
|
| - functions->fUniform4iv = noOpGLUniform4iv;
|
| - functions->fUniformMatrix2fv = noOpGLUniformMatrix2fv;
|
| - functions->fUniformMatrix3fv = noOpGLUniformMatrix3fv;
|
| - functions->fUniformMatrix4fv = noOpGLUniformMatrix4fv;
|
| - functions->fUnmapBuffer = nullGLUnmapBuffer;
|
| - functions->fUseProgram = nullGLUseProgram;
|
| - functions->fVertexAttrib1f = noOpGLVertexAttrib1f;
|
| - functions->fVertexAttrib2fv = noOpGLVertexAttrib2fv;
|
| - functions->fVertexAttrib3fv = noOpGLVertexAttrib3fv;
|
| - functions->fVertexAttrib4fv = noOpGLVertexAttrib4fv;
|
| - functions->fVertexAttribDivisor = noOpGLVertexAttribDivisor;
|
| - functions->fVertexAttribIPointer = noOpGLVertexAttribIPointer;
|
| - functions->fVertexAttribPointer = noOpGLVertexAttribPointer;
|
| - functions->fViewport = nullGLViewport;
|
| - functions->fBindFramebuffer = nullGLBindFramebuffer;
|
| - functions->fBindRenderbuffer = nullGLBindRenderbuffer;
|
| - functions->fCheckFramebufferStatus = noOpGLCheckFramebufferStatus;
|
| - functions->fDeleteFramebuffers = nullGLDeleteFramebuffers;
|
| - functions->fDeleteRenderbuffers = nullGLDeleteRenderbuffers;
|
| - functions->fFramebufferRenderbuffer = nullGLFramebufferRenderbuffer;
|
| - functions->fFramebufferTexture2D = nullGLFramebufferTexture2D;
|
| - functions->fGenFramebuffers = noOpGLGenIds;
|
| - functions->fGenRenderbuffers = noOpGLGenIds;
|
| - functions->fGetFramebufferAttachmentParameteriv = noOpGLGetFramebufferAttachmentParameteriv;
|
| - functions->fGetRenderbufferParameteriv = noOpGLGetRenderbufferParameteriv;
|
| - functions->fRenderbufferStorage = noOpGLRenderbufferStorage;
|
| - functions->fRenderbufferStorageMultisample = noOpGLRenderbufferStorageMultisample;
|
| - functions->fBlitFramebuffer = noOpGLBlitFramebuffer;
|
| - functions->fResolveMultisampleFramebuffer = noOpGLResolveMultisampleFramebuffer;
|
| - functions->fMatrixLoadf = noOpGLMatrixLoadf;
|
| - functions->fMatrixLoadIdentity = noOpGLMatrixLoadIdentity;
|
| - functions->fBindFragDataLocationIndexed = noOpGLBindFragDataLocationIndexed;
|
| -
|
| - interface->fExtensions.init(kGL_GrGLStandard, functions->fGetString, functions->fGetStringi,
|
| - functions->fGetIntegerv, nullptr, GR_EGL_NO_DISPLAY);
|
| - return interface;
|
| -}
|
| +const char* NullInterface::kExtensions[] = {
|
| + "GL_ARB_framebuffer_object",
|
| + "GL_ARB_blend_func_extended",
|
| + "GL_ARB_timer_query",
|
| + "GL_ARB_draw_buffers",
|
| + "GL_ARB_occlusion_query",
|
| + "GL_EXT_stencil_wrap",
|
| + nullptr, // signifies the end of the array.
|
| +};
|
| +
|
| +} // anonymous namespace
|
| +
|
| +const GrGLInterface* GrGLCreateNullInterface() { return new NullInterface; }
|
|
|