diff options
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/GrCaps.cpp | 2 | ||||
-rw-r--r-- | src/gpu/gl/GrGLAssembleInterface.cpp | 8 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCaps.cpp | 5 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCreateNullInterface.cpp | 3 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 12 | ||||
-rw-r--r-- | src/gpu/gl/GrGLInterface.cpp | 7 | ||||
-rw-r--r-- | src/gpu/gl/GrGLNoOpInterface.cpp | 7 | ||||
-rw-r--r-- | src/gpu/gl/GrGLNoOpInterface.h | 6 | ||||
-rw-r--r-- | src/gpu/gl/GrGLVertexArray.cpp | 60 | ||||
-rw-r--r-- | src/gpu/gl/GrGLVertexArray.h | 49 | ||||
-rw-r--r-- | src/gpu/gl/SkNullGLContext.cpp | 3 | ||||
-rw-r--r-- | src/gpu/gl/debug/GrGLCreateDebugInterface.cpp | 3 | ||||
-rw-r--r-- | src/gpu/glsl/GrGLSL.h | 2 |
13 files changed, 103 insertions, 64 deletions
diff --git a/src/gpu/GrCaps.cpp b/src/gpu/GrCaps.cpp index 46f49357c7..2568e567fc 100644 --- a/src/gpu/GrCaps.cpp +++ b/src/gpu/GrCaps.cpp @@ -15,6 +15,7 @@ GrShaderCaps::GrShaderCaps() { fPathRenderingSupport = false; fDstReadInShaderSupport = false; fDualSourceBlendingSupport = false; + fIntegerSupport = false; fShaderPrecisionVaries = false; } @@ -50,6 +51,7 @@ SkString GrShaderCaps::dump() const { r.appendf("Path Rendering Support : %s\n", gNY[fPathRenderingSupport]); r.appendf("Dst Read In Shader Support : %s\n", gNY[fDstReadInShaderSupport]); r.appendf("Dual Source Blending Support : %s\n", gNY[fDualSourceBlendingSupport]); + r.appendf("Integer Support : %s\n", gNY[fIntegerSupport]); r.appendf("Shader Float Precisions (varies: %s):\n", gNY[fShaderPrecisionVaries]); diff --git a/src/gpu/gl/GrGLAssembleInterface.cpp b/src/gpu/gl/GrGLAssembleInterface.cpp index 30eed62c5e..e52d302190 100644 --- a/src/gpu/gl/GrGLAssembleInterface.cpp +++ b/src/gpu/gl/GrGLAssembleInterface.cpp @@ -246,6 +246,10 @@ const GrGLInterface* GrGLAssembleGLInterface(void* ctx, GrGLGetProc get) { GET_PROC(VertexAttribDivisor); } + if (glVer >= GR_GL_VER(3,0)) { + GET_PROC(VertexAttribIPointer); + } + GET_PROC(VertexAttribPointer); GET_PROC(Viewport); GET_PROC(BindFragDataLocationIndexed); @@ -678,6 +682,10 @@ const GrGLInterface* GrGLAssembleGLESInterface(void* ctx, GrGLGetProc get) { GET_PROC_SUFFIX(VertexAttribDivisor, EXT); } + if (version >= GR_GL_VER(3,0)) { + GET_PROC(VertexAttribIPointer); + } + GET_PROC(VertexAttribPointer); GET_PROC(Viewport); GET_PROC(BindFramebuffer); diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index a913fbeca2..cb3f5dd55f 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -279,12 +279,17 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS glslCaps->fGeometryShaderSupport = ctxInfo.version() >= GR_GL_VER(3, 2) && ctxInfo.glslGeneration() >= k150_GrGLSLGeneration; + glslCaps->fIntegerSupport = ctxInfo.version() >= GR_GL_VER(3, 0) && + ctxInfo.glslGeneration() >= k130_GrGLSLGeneration; } else { glslCaps->fDualSourceBlendingSupport = ctxInfo.hasExtension("GL_EXT_blend_func_extended"); glslCaps->fShaderDerivativeSupport = ctxInfo.version() >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_OES_standard_derivatives"); + + glslCaps->fIntegerSupport = ctxInfo.version() >= GR_GL_VER(3, 0) && + ctxInfo.glslGeneration() >= k330_GrGLSLGeneration; // We use this value for GLSL ES 3.0. } if (ctxInfo.hasExtension("GL_EXT_shader_pixel_local_storage")) { diff --git a/src/gpu/gl/GrGLCreateNullInterface.cpp b/src/gpu/gl/GrGLCreateNullInterface.cpp index f0a3e7d4bd..f56b1d9773 100644 --- a/src/gpu/gl/GrGLCreateNullInterface.cpp +++ b/src/gpu/gl/GrGLCreateNullInterface.cpp @@ -465,8 +465,9 @@ const GrGLInterface* GrGLCreateNullInterface() { functions->fVertexAttrib2fv = noOpGLVertexAttrib2fv; functions->fVertexAttrib3fv = noOpGLVertexAttrib3fv; functions->fVertexAttrib4fv = noOpGLVertexAttrib4fv; - functions->fVertexAttribPointer = noOpGLVertexAttribPointer; functions->fVertexAttribDivisor = noOpGLVertexAttribDivisor; + functions->fVertexAttribIPointer = noOpGLVertexAttribIPointer; + functions->fVertexAttribPointer = noOpGLVertexAttribPointer; functions->fViewport = nullGLViewport; functions->fBindFramebuffer = nullGLBindFramebuffer; functions->fBindRenderbuffer = nullGLBindRenderbuffer; diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index ad85707b3b..e29a7f81f3 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -1807,9 +1807,7 @@ void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc, attribState->set(this, attribIndex, vbuf->bufferID(), - GrGLAttribTypeToLayout(attribType).fCount, - GrGLAttribTypeToLayout(attribType).fType, - GrGLAttribTypeToLayout(attribType).fNormalized, + attribType, stride, reinterpret_cast<GrGLvoid*>(vertexOffsetInBytes + offset)); offset += attrib.fOffset; @@ -2588,7 +2586,7 @@ void GrGLGpu::stampRectUsingProgram(GrGLuint program, const SkRect& bounds, GrGL GrGLAttribArrayState* attribs = this->fHWGeometryState.bindArrayAndBufferToDraw(this, arrayBuffer); - attribs->set(this, 0, arrayBuffer, 2, GR_GL_FLOAT, false, 2 * sizeof(GrGLfloat), 0); + attribs->set(this, 0, arrayBuffer, kVec2f_GrVertexAttribType, 2 * sizeof(GrGLfloat), 0); attribs->disableUnusedArrays(this, 0x1); GL_CALL(Uniform4f(posXformUniform, bounds.width(), bounds.height(), bounds.left(), @@ -3529,7 +3527,8 @@ void GrGLGpu::drawDebugWireRect(GrRenderTarget* rt, const SkIRect& rect, GrColor GrGLAttribArrayState* attribs = fHWGeometryState.bindArrayAndBufferToDraw(this, fWireRectArrayBuffer); - attribs->set(this, 0, fWireRectArrayBuffer, 2, GR_GL_FLOAT, false, 2 * sizeof(GrGLfloat), 0); + attribs->set(this, 0, fWireRectArrayBuffer, kVec2f_GrVertexAttribType, 2 * sizeof(GrGLfloat), + 0); attribs->disableUnusedArrays(this, 0x1); GL_CALL(Uniform4fv(fWireRectProgram.fRectUniform, 1, edges)); @@ -3574,7 +3573,8 @@ void GrGLGpu::copySurfaceAsDraw(GrSurface* dst, GrGLAttribArrayState* attribs = fHWGeometryState.bindArrayAndBufferToDraw(this, fCopyProgramArrayBuffer); - attribs->set(this, 0, fCopyProgramArrayBuffer, 2, GR_GL_FLOAT, false, 2 * sizeof(GrGLfloat), 0); + attribs->set(this, 0, fCopyProgramArrayBuffer, kVec2f_GrVertexAttribType, 2 * sizeof(GrGLfloat), + 0); attribs->disableUnusedArrays(this, 0x1); // dst rect edges in NDC (-1 to 1) diff --git a/src/gpu/gl/GrGLInterface.cpp b/src/gpu/gl/GrGLInterface.cpp index 925f081b34..c09efae2b8 100644 --- a/src/gpu/gl/GrGLInterface.cpp +++ b/src/gpu/gl/GrGLInterface.cpp @@ -416,6 +416,13 @@ bool GrGLInterface::validate() const { } } + // glVertexAttribIPointer was added in version 3.0 of both desktop and ES. + if (glVer >= GR_GL_VER(3, 0)) { + if (NULL == fFunctions.fVertexAttribIPointer) { + RETURN_FALSE_INTERFACE + } + } + if (kGL_GrGLStandard == fStandard) { if (glVer >= GR_GL_VER(3, 0) || fExtensions.has("GL_ARB_vertex_array_object")) { if (nullptr == fFunctions.fBindVertexArray || diff --git a/src/gpu/gl/GrGLNoOpInterface.cpp b/src/gpu/gl/GrGLNoOpInterface.cpp index 113c47d054..f08d737d58 100644 --- a/src/gpu/gl/GrGLNoOpInterface.cpp +++ b/src/gpu/gl/GrGLNoOpInterface.cpp @@ -394,6 +394,13 @@ GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniformMatrix4fv(GrGLint location, GrGLvoid GR_GL_FUNCTION_TYPE noOpGLVertexAttrib4fv(GrGLuint indx, const GrGLfloat* values) { } +GrGLvoid GR_GL_FUNCTION_TYPE noOpGLVertexAttribIPointer(GrGLuint indx, + GrGLint size, + GrGLenum type, + GrGLsizei stride, + const GrGLvoid* ptr) { +} + GrGLvoid GR_GL_FUNCTION_TYPE noOpGLVertexAttribPointer(GrGLuint indx, GrGLint size, GrGLenum type, diff --git a/src/gpu/gl/GrGLNoOpInterface.h b/src/gpu/gl/GrGLNoOpInterface.h index 627de63d7d..44894b763a 100644 --- a/src/gpu/gl/GrGLNoOpInterface.h +++ b/src/gpu/gl/GrGLNoOpInterface.h @@ -287,6 +287,12 @@ GrGLvoid GR_GL_FUNCTION_TYPE noOpGLUniformMatrix4fv(GrGLint location, GrGLvoid GR_GL_FUNCTION_TYPE noOpGLVertexAttrib4fv(GrGLuint indx, const GrGLfloat* values); +GrGLvoid GR_GL_FUNCTION_TYPE noOpGLVertexAttribIPointer(GrGLuint indx, + GrGLint size, + GrGLenum type, + GrGLsizei stride, + const GrGLvoid* ptr); + GrGLvoid GR_GL_FUNCTION_TYPE noOpGLVertexAttribPointer(GrGLuint indx, GrGLint size, GrGLenum type, diff --git a/src/gpu/gl/GrGLVertexArray.cpp b/src/gpu/gl/GrGLVertexArray.cpp index 8cfa8d6550..fdb395d37a 100644 --- a/src/gpu/gl/GrGLVertexArray.cpp +++ b/src/gpu/gl/GrGLVertexArray.cpp @@ -8,14 +8,38 @@ #include "GrGLVertexArray.h" #include "GrGLGpu.h" +struct AttribLayout { + GrGLint fCount; + GrGLenum fType; + GrGLboolean fNormalized; // Only used by floating point types. +}; +static const AttribLayout gLayouts[kGrVertexAttribTypeCount] = { + {1, GR_GL_FLOAT, false}, // kFloat_GrVertexAttribType + {2, GR_GL_FLOAT, false}, // kVec2f_GrVertexAttribType + {3, GR_GL_FLOAT, false}, // kVec3f_GrVertexAttribType + {4, GR_GL_FLOAT, false}, // kVec4f_GrVertexAttribType + {1, GR_GL_UNSIGNED_BYTE, true}, // kUByte_GrVertexAttribType + {4, GR_GL_UNSIGNED_BYTE, true}, // kVec4ub_GrVertexAttribType + {2, GR_GL_SHORT, false}, // kVec2s_GrVertexAttribType + {1, GR_GL_INT, false}, // kInt_GrVertexAttribType + {1, GR_GL_UNSIGNED_INT, false}, // kUint_GrVertexAttribType +}; + +GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType); +GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType); +GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType); +GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType); +GR_STATIC_ASSERT(4 == kUByte_GrVertexAttribType); +GR_STATIC_ASSERT(5 == kVec4ub_GrVertexAttribType); +GR_STATIC_ASSERT(6 == kVec2s_GrVertexAttribType); +GR_STATIC_ASSERT(7 == kInt_GrVertexAttribType); +GR_STATIC_ASSERT(8 == kUint_GrVertexAttribType); void GrGLAttribArrayState::set(GrGLGpu* gpu, int index, GrGLuint vertexBufferID, - GrGLint size, - GrGLenum type, - GrGLboolean normalized, + GrVertexAttribType type, GrGLsizei stride, GrGLvoid* offset) { SkASSERT(index >= 0 && index < fAttribArrayStates.count()); @@ -27,23 +51,31 @@ void GrGLAttribArrayState::set(GrGLGpu* gpu, } if (!array->fAttribPointerIsValid || array->fVertexBufferID != vertexBufferID || - array->fSize != size || - array->fNormalized != normalized || + array->fType != type || array->fStride != stride || array->fOffset != offset) { gpu->bindVertexBuffer(vertexBufferID); - GR_GL_CALL(gpu->glInterface(), VertexAttribPointer(index, - size, - type, - normalized, - stride, - offset)); + const AttribLayout& layout = gLayouts[type]; + if (!GrVertexAttribTypeIsIntType(type)) { + GR_GL_CALL(gpu->glInterface(), VertexAttribPointer(index, + layout.fCount, + layout.fType, + layout.fNormalized, + stride, + offset)); + } else { + SkASSERT(gpu->caps()->shaderCaps()->integerSupport()); + SkASSERT(!layout.fNormalized); + GR_GL_CALL(gpu->glInterface(), VertexAttribIPointer(index, + layout.fCount, + layout.fType, + stride, + offset)); + } array->fAttribPointerIsValid = true; array->fVertexBufferID = vertexBufferID; - array->fSize = size; - array->fNormalized = normalized; - array->fStride = stride; + array->fType = type; array->fOffset = offset; } } diff --git a/src/gpu/gl/GrGLVertexArray.h b/src/gpu/gl/GrGLVertexArray.h index 0a5dea6a1e..f5a97672f3 100644 --- a/src/gpu/gl/GrGLVertexArray.h +++ b/src/gpu/gl/GrGLVertexArray.h @@ -17,35 +17,6 @@ class GrGLVertexBuffer; class GrGLIndexBuffer; class GrGLGpu; -struct GrGLAttribLayout { - GrGLint fCount; - GrGLenum fType; - GrGLboolean fNormalized; -}; - -static inline const GrGLAttribLayout& GrGLAttribTypeToLayout(GrVertexAttribType type) { - static const GrGLAttribLayout kLayouts[kGrVertexAttribTypeCount] = { - {1, GR_GL_FLOAT, false}, // kFloat_GrVertexAttribType - {2, GR_GL_FLOAT, false}, // kVec2f_GrVertexAttribType - {3, GR_GL_FLOAT, false}, // kVec3f_GrVertexAttribType - {4, GR_GL_FLOAT, false}, // kVec4f_GrVertexAttribType - {1, GR_GL_UNSIGNED_BYTE, true}, // kUByte_GrVertexAttribType - {4, GR_GL_UNSIGNED_BYTE, true}, // kVec4ub_GrVertexAttribType - {2, GR_GL_SHORT, false}, // kVec2s_GrVertexAttribType - {4, GR_GL_INT, false}, // kInt_GrVertexAttribType - }; - GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType); - GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType); - GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType); - GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType); - GR_STATIC_ASSERT(4 == kUByte_GrVertexAttribType); - GR_STATIC_ASSERT(5 == kVec4ub_GrVertexAttribType); - GR_STATIC_ASSERT(6 == kVec2s_GrVertexAttribType); - GR_STATIC_ASSERT(7 == kInt_GrVertexAttribType); - GR_STATIC_ASSERT(SK_ARRAY_COUNT(kLayouts) == kGrVertexAttribTypeCount); - return kLayouts[type]; -} - /** * This sets and tracks the vertex attribute array state. It is used internally by GrGLVertexArray * (below) but is separate because it is also used to track the state of vertex array object 0. @@ -71,9 +42,7 @@ public: void set(GrGLGpu*, int attribIndex, GrGLuint vertexBufferID, - GrGLint size, - GrGLenum type, - GrGLboolean normalized, + GrVertexAttribType type, GrGLsizei stride, GrGLvoid* offset); @@ -115,15 +84,13 @@ private: fAttribPointerIsValid = false; } - bool fEnableIsValid; - bool fAttribPointerIsValid; - bool fEnabled; - GrGLuint fVertexBufferID; - GrGLint fSize; - GrGLenum fType; - GrGLboolean fNormalized; - GrGLsizei fStride; - GrGLvoid* fOffset; + bool fEnableIsValid; + bool fAttribPointerIsValid; + bool fEnabled; + GrGLuint fVertexBufferID; + GrVertexAttribType fType; + GrGLsizei fStride; + GrGLvoid* fOffset; }; SkSTArray<16, AttribArrayState, true> fAttribArrayStates; diff --git a/src/gpu/gl/SkNullGLContext.cpp b/src/gpu/gl/SkNullGLContext.cpp index dafa1ef0bc..68b19ce990 100644 --- a/src/gpu/gl/SkNullGLContext.cpp +++ b/src/gpu/gl/SkNullGLContext.cpp @@ -514,8 +514,9 @@ static GrGLInterface* create_null_interface(State* state) { functions->fVertexAttrib2fv = noOpGLVertexAttrib2fv; functions->fVertexAttrib3fv = noOpGLVertexAttrib3fv; functions->fVertexAttrib4fv = noOpGLVertexAttrib4fv; - functions->fVertexAttribPointer = noOpGLVertexAttribPointer; functions->fVertexAttribDivisor = noOpGLVertexAttribDivisor; + functions->fVertexAttribIPointer = noOpGLVertexAttribIPointer; + functions->fVertexAttribPointer = noOpGLVertexAttribPointer; functions->fViewport = nullGLViewport; functions->fBindFramebuffer = nullGLBindFramebuffer; functions->fBindRenderbuffer = nullGLBindRenderbuffer; diff --git a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp index bcc3007650..2118c02fa7 100644 --- a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp +++ b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp @@ -956,8 +956,9 @@ const GrGLInterface* GrGLCreateDebugInterface() { functions->fVertexAttrib2fv = noOpGLVertexAttrib2fv; functions->fVertexAttrib3fv = noOpGLVertexAttrib3fv; functions->fVertexAttrib4fv = noOpGLVertexAttrib4fv; - functions->fVertexAttribPointer = noOpGLVertexAttribPointer; functions->fVertexAttribDivisor = noOpGLVertexAttribDivisor; + functions->fVertexAttribIPointer = noOpGLVertexAttribIPointer; + functions->fVertexAttribPointer = noOpGLVertexAttribPointer; functions->fViewport = noOpGLViewport; functions->fBindFramebuffer = debugGLBindFramebuffer; functions->fBindRenderbuffer = debugGLBindRenderbuffer; diff --git a/src/gpu/glsl/GrGLSL.h b/src/gpu/glsl/GrGLSL.h index dc53d7befa..6fc8f83c7a 100644 --- a/src/gpu/glsl/GrGLSL.h +++ b/src/gpu/glsl/GrGLSL.h @@ -104,6 +104,8 @@ static inline const char* GrGLSLTypeString(GrSLType t) { return "bool"; case kInt_GrSLType: return "int"; + case kUint_GrSLType: + return "uint"; default: SkFAIL("Unknown shader var type."); return ""; // suppress warning |