OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrGLVertexArray.h" | 8 #include "GrGLVertexArray.h" |
9 #include "GrGLGpu.h" | 9 #include "GrGLGpu.h" |
10 | 10 |
| 11 struct AttribLayout { |
| 12 GrGLint fCount; |
| 13 GrGLenum fType; |
| 14 GrGLboolean fNormalized; // Only used by floating point types. |
| 15 }; |
11 | 16 |
| 17 static const AttribLayout gLayouts[kGrVertexAttribTypeCount] = { |
| 18 {1, GR_GL_FLOAT, false}, // kFloat_GrVertexAttribType |
| 19 {2, GR_GL_FLOAT, false}, // kVec2f_GrVertexAttribType |
| 20 {3, GR_GL_FLOAT, false}, // kVec3f_GrVertexAttribType |
| 21 {4, GR_GL_FLOAT, false}, // kVec4f_GrVertexAttribType |
| 22 {1, GR_GL_UNSIGNED_BYTE, true}, // kUByte_GrVertexAttribType |
| 23 {4, GR_GL_UNSIGNED_BYTE, true}, // kVec4ub_GrVertexAttribType |
| 24 {2, GR_GL_SHORT, false}, // kVec2s_GrVertexAttribType |
| 25 {1, GR_GL_INT, false}, // kInt_GrVertexAttribType |
| 26 {1, GR_GL_UNSIGNED_INT, false}, // kUint_GrVertexAttribType |
| 27 }; |
| 28 |
| 29 GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType); |
| 30 GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType); |
| 31 GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType); |
| 32 GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType); |
| 33 GR_STATIC_ASSERT(4 == kUByte_GrVertexAttribType); |
| 34 GR_STATIC_ASSERT(5 == kVec4ub_GrVertexAttribType); |
| 35 GR_STATIC_ASSERT(6 == kVec2s_GrVertexAttribType); |
| 36 GR_STATIC_ASSERT(7 == kInt_GrVertexAttribType); |
| 37 GR_STATIC_ASSERT(8 == kUint_GrVertexAttribType); |
12 | 38 |
13 void GrGLAttribArrayState::set(GrGLGpu* gpu, | 39 void GrGLAttribArrayState::set(GrGLGpu* gpu, |
14 int index, | 40 int index, |
15 GrGLuint vertexBufferID, | 41 GrGLuint vertexBufferID, |
16 GrGLint size, | 42 GrVertexAttribType type, |
17 GrGLenum type, | |
18 GrGLboolean normalized, | |
19 GrGLsizei stride, | 43 GrGLsizei stride, |
20 GrGLvoid* offset) { | 44 GrGLvoid* offset) { |
21 SkASSERT(index >= 0 && index < fAttribArrayStates.count()); | 45 SkASSERT(index >= 0 && index < fAttribArrayStates.count()); |
22 AttribArrayState* array = &fAttribArrayStates[index]; | 46 AttribArrayState* array = &fAttribArrayStates[index]; |
23 if (!array->fEnableIsValid || !array->fEnabled) { | 47 if (!array->fEnableIsValid || !array->fEnabled) { |
24 GR_GL_CALL(gpu->glInterface(), EnableVertexAttribArray(index)); | 48 GR_GL_CALL(gpu->glInterface(), EnableVertexAttribArray(index)); |
25 array->fEnableIsValid = true; | 49 array->fEnableIsValid = true; |
26 array->fEnabled = true; | 50 array->fEnabled = true; |
27 } | 51 } |
28 if (!array->fAttribPointerIsValid || | 52 if (!array->fAttribPointerIsValid || |
29 array->fVertexBufferID != vertexBufferID || | 53 array->fVertexBufferID != vertexBufferID || |
30 array->fSize != size || | 54 array->fType != type || |
31 array->fNormalized != normalized || | |
32 array->fStride != stride || | 55 array->fStride != stride || |
33 array->fOffset != offset) { | 56 array->fOffset != offset) { |
34 | 57 |
35 gpu->bindVertexBuffer(vertexBufferID); | 58 gpu->bindVertexBuffer(vertexBufferID); |
36 GR_GL_CALL(gpu->glInterface(), VertexAttribPointer(index, | 59 const AttribLayout& layout = gLayouts[type]; |
37 size, | 60 if (!GrVertexAttribTypeIsIntType(type)) { |
38 type, | 61 GR_GL_CALL(gpu->glInterface(), VertexAttribPointer(index, |
39 normalized, | 62 layout.fCount, |
40 stride, | 63 layout.fType, |
41 offset)); | 64 layout.fNormalize
d, |
| 65 stride, |
| 66 offset)); |
| 67 } else { |
| 68 SkASSERT(gpu->caps()->shaderCaps()->integerSupport()); |
| 69 SkASSERT(!layout.fNormalized); |
| 70 GR_GL_CALL(gpu->glInterface(), VertexAttribIPointer(index, |
| 71 layout.fCount, |
| 72 layout.fType, |
| 73 stride, |
| 74 offset)); |
| 75 } |
42 array->fAttribPointerIsValid = true; | 76 array->fAttribPointerIsValid = true; |
43 array->fVertexBufferID = vertexBufferID; | 77 array->fVertexBufferID = vertexBufferID; |
44 array->fSize = size; | 78 array->fType = type; |
45 array->fNormalized = normalized; | |
46 array->fStride = stride; | 79 array->fStride = stride; |
47 array->fOffset = offset; | 80 array->fOffset = offset; |
48 } | 81 } |
49 } | 82 } |
50 | 83 |
51 void GrGLAttribArrayState::disableUnusedArrays(const GrGLGpu* gpu, uint64_t used
Mask) { | 84 void GrGLAttribArrayState::disableUnusedArrays(const GrGLGpu* gpu, uint64_t used
Mask) { |
52 int count = fAttribArrayStates.count(); | 85 int count = fAttribArrayStates.count(); |
53 for (int i = 0; i < count; ++i) { | 86 for (int i = 0; i < count; ++i) { |
54 if (!(usedMask & 0x1)) { | 87 if (!(usedMask & 0x1)) { |
55 if (!fAttribArrayStates[i].fEnableIsValid || fAttribArrayStates[i].f
Enabled) { | 88 if (!fAttribArrayStates[i].fEnableIsValid || fAttribArrayStates[i].f
Enabled) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 void GrGLVertexArray::notifyIndexBufferDelete(GrGLuint bufferID) { | 129 void GrGLVertexArray::notifyIndexBufferDelete(GrGLuint bufferID) { |
97 if (fIndexBufferIDIsValid && bufferID == fIndexBufferID) { | 130 if (fIndexBufferIDIsValid && bufferID == fIndexBufferID) { |
98 fIndexBufferID = 0; | 131 fIndexBufferID = 0; |
99 } | 132 } |
100 } | 133 } |
101 | 134 |
102 void GrGLVertexArray::invalidateCachedState() { | 135 void GrGLVertexArray::invalidateCachedState() { |
103 fAttribArrays.invalidate(); | 136 fAttribArrays.invalidate(); |
104 fIndexBufferIDIsValid = false; | 137 fIndexBufferIDIsValid = false; |
105 } | 138 } |
OLD | NEW |