OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 #ifndef GrGpuGL_DEFINED | 8 #ifndef GrGpuGL_DEFINED |
9 #define GrGpuGL_DEFINED | 9 #define GrGpuGL_DEFINED |
10 | 10 |
11 #include "GrDrawState.h" | 11 #include "GrDrawState.h" |
12 #include "GrGLContext.h" | 12 #include "GrGLContext.h" |
13 #include "GrGLIRect.h" | 13 #include "GrGLIRect.h" |
14 #include "GrGLIndexBuffer.h" | 14 #include "GrGLIndexBuffer.h" |
15 #include "GrGLPathRendering.h" | 15 #include "GrGLPathRendering.h" |
16 #include "GrGLProgram.h" | 16 #include "GrGLProgram.h" |
17 #include "GrGLRenderTarget.h" | 17 #include "GrGLRenderTarget.h" |
18 #include "GrGLStencilBuffer.h" | 18 #include "GrGLStencilBuffer.h" |
19 #include "GrGLTexture.h" | 19 #include "GrGLTexture.h" |
20 #include "GrGLVertexArray.h" | 20 #include "GrGLVertexArray.h" |
21 #include "GrGLVertexBuffer.h" | 21 #include "GrGLVertexBuffer.h" |
22 #include "GrGpu.h" | 22 #include "GrGpu.h" |
23 #include "GrOptDrawState.h" | 23 #include "GrOptDrawState.h" |
24 #include "SkTypes.h" | 24 #include "SkTypes.h" |
25 | 25 |
26 #ifdef SK_DEVELOPER | 26 #ifdef SK_DEVELOPER |
27 #define PROGRAM_CACHE_STATS | 27 #define PROGRAM_CACHE_STATS |
28 #endif | 28 #endif |
29 | 29 |
30 class GrGpuGL : public GrGpu { | 30 class GrGLGpu : public GrGpu { |
31 public: | 31 public: |
32 GrGpuGL(const GrGLContext& ctx, GrContext* context); | 32 GrGLGpu(const GrGLContext& ctx, GrContext* context); |
33 virtual ~GrGpuGL(); | 33 virtual ~GrGLGpu(); |
34 | 34 |
35 virtual void contextAbandoned() SK_OVERRIDE; | 35 virtual void contextAbandoned() SK_OVERRIDE; |
36 | 36 |
37 const GrGLContext& glContext() const { return fGLContext; } | 37 const GrGLContext& glContext() const { return fGLContext; } |
38 | 38 |
39 const GrGLInterface* glInterface() const { return fGLContext.interface(); } | 39 const GrGLInterface* glInterface() const { return fGLContext.interface(); } |
40 const GrGLContextInfo& ctxInfo() const { return fGLContext; } | 40 const GrGLContextInfo& ctxInfo() const { return fGLContext; } |
41 GrGLStandard glStandard() const { return fGLContext.standard(); } | 41 GrGLStandard glStandard() const { return fGLContext.standard(); } |
42 GrGLVersion glVersion() const { return fGLContext.version(); } | 42 GrGLVersion glVersion() const { return fGLContext.version(); } |
43 GrGLSLGeneration glslGeneration() const { return fGLContext.glslGeneration()
; } | 43 GrGLSLGeneration glslGeneration() const { return fGLContext.glslGeneration()
; } |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 | 173 |
174 // Subclasses should call this to flush the blend state. | 174 // Subclasses should call this to flush the blend state. |
175 void flushBlend(const GrOptDrawState& optState); | 175 void flushBlend(const GrOptDrawState& optState); |
176 | 176 |
177 bool hasExtension(const char* ext) const { return fGLContext.hasExtension(ex
t); } | 177 bool hasExtension(const char* ext) const { return fGLContext.hasExtension(ex
t); } |
178 | 178 |
179 static bool BlendCoeffReferencesConstant(GrBlendCoeff coeff); | 179 static bool BlendCoeffReferencesConstant(GrBlendCoeff coeff); |
180 | 180 |
181 class ProgramCache : public ::SkNoncopyable { | 181 class ProgramCache : public ::SkNoncopyable { |
182 public: | 182 public: |
183 ProgramCache(GrGpuGL* gpu); | 183 ProgramCache(GrGLGpu* gpu); |
184 ~ProgramCache(); | 184 ~ProgramCache(); |
185 | 185 |
186 void abandon(); | 186 void abandon(); |
187 GrGLProgram* getProgram(const GrOptDrawState&); | 187 GrGLProgram* getProgram(const GrOptDrawState&); |
188 | 188 |
189 private: | 189 private: |
190 enum { | 190 enum { |
191 // We may actually have kMaxEntries+1 shaders in the GL context beca
use we create a new | 191 // We may actually have kMaxEntries+1 shaders in the GL context beca
use we create a new |
192 // shader before evicting from the cache. | 192 // shader before evicting from the cache. |
193 kMaxEntries = 128, | 193 kMaxEntries = 128, |
194 kHashBits = 6, | 194 kHashBits = 6, |
195 }; | 195 }; |
196 | 196 |
197 struct Entry; | 197 struct Entry; |
198 | 198 |
199 struct ProgDescLess; | 199 struct ProgDescLess; |
200 | 200 |
201 // binary search for entry matching desc. returns index into fEntries th
at matches desc or ~ | 201 // binary search for entry matching desc. returns index into fEntries th
at matches desc or ~ |
202 // of the index of where it should be inserted. | 202 // of the index of where it should be inserted. |
203 int search(const GrProgramDesc& desc) const; | 203 int search(const GrProgramDesc& desc) const; |
204 | 204 |
205 // sorted array of all the entries | 205 // sorted array of all the entries |
206 Entry* fEntries[kMaxEntries]; | 206 Entry* fEntries[kMaxEntries]; |
207 // hash table based on lowest kHashBits bits of the program key. Used to
avoid binary | 207 // hash table based on lowest kHashBits bits of the program key. Used to
avoid binary |
208 // searching fEntries. | 208 // searching fEntries. |
209 Entry* fHashTable[1 << kHashBits]; | 209 Entry* fHashTable[1 << kHashBits]; |
210 | 210 |
211 int fCount; | 211 int fCount; |
212 unsigned int fCurrLRUStamp; | 212 unsigned int fCurrLRUStamp; |
213 GrGpuGL* fGpu; | 213 GrGLGpu* fGpu; |
214 #ifdef PROGRAM_CACHE_STATS | 214 #ifdef PROGRAM_CACHE_STATS |
215 int fTotalRequests; | 215 int fTotalRequests; |
216 int fCacheMisses; | 216 int fCacheMisses; |
217 int fHashMisses; // cache hit but hash table mis
sed | 217 int fHashMisses; // cache hit but hash table mis
sed |
218 #endif | 218 #endif |
219 }; | 219 }; |
220 | 220 |
221 // flushes dithering, color-mask, and face culling stat | 221 // flushes dithering, color-mask, and face culling stat |
222 void flushMiscFixedFunctionState(const GrOptDrawState&); | 222 void flushMiscFixedFunctionState(const GrOptDrawState&); |
223 | 223 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 } | 325 } |
326 } | 326 } |
327 | 327 |
328 void notifyVertexArrayDelete(GrGLuint id) { | 328 void notifyVertexArrayDelete(GrGLuint id) { |
329 if (fBoundVertexArrayIDIsValid && fBoundVertexArrayID == id) { | 329 if (fBoundVertexArrayIDIsValid && fBoundVertexArrayID == id) { |
330 // Does implicit bind to 0 | 330 // Does implicit bind to 0 |
331 fBoundVertexArrayID = 0; | 331 fBoundVertexArrayID = 0; |
332 } | 332 } |
333 } | 333 } |
334 | 334 |
335 void setVertexArrayID(GrGpuGL* gpu, GrGLuint arrayID) { | 335 void setVertexArrayID(GrGLGpu* gpu, GrGLuint arrayID) { |
336 if (!gpu->glCaps().vertexArrayObjectSupport()) { | 336 if (!gpu->glCaps().vertexArrayObjectSupport()) { |
337 SkASSERT(0 == arrayID); | 337 SkASSERT(0 == arrayID); |
338 return; | 338 return; |
339 } | 339 } |
340 if (!fBoundVertexArrayIDIsValid || arrayID != fBoundVertexArrayID) { | 340 if (!fBoundVertexArrayIDIsValid || arrayID != fBoundVertexArrayID) { |
341 GR_GL_CALL(gpu->glInterface(), BindVertexArray(arrayID)); | 341 GR_GL_CALL(gpu->glInterface(), BindVertexArray(arrayID)); |
342 fBoundVertexArrayIDIsValid = true; | 342 fBoundVertexArrayIDIsValid = true; |
343 fBoundVertexArrayID = arrayID; | 343 fBoundVertexArrayID = arrayID; |
344 } | 344 } |
345 } | 345 } |
(...skipping 11 matching lines...) Expand all Loading... |
357 void notifyIndexBufferDelete(GrGLuint id) { | 357 void notifyIndexBufferDelete(GrGLuint id) { |
358 if (fDefaultVertexArrayBoundIndexBufferIDIsValid && | 358 if (fDefaultVertexArrayBoundIndexBufferIDIsValid && |
359 id == fDefaultVertexArrayBoundIndexBufferID) { | 359 id == fDefaultVertexArrayBoundIndexBufferID) { |
360 fDefaultVertexArrayBoundIndexBufferID = 0; | 360 fDefaultVertexArrayBoundIndexBufferID = 0; |
361 } | 361 } |
362 if (fVBOVertexArray) { | 362 if (fVBOVertexArray) { |
363 fVBOVertexArray->notifyIndexBufferDelete(id); | 363 fVBOVertexArray->notifyIndexBufferDelete(id); |
364 } | 364 } |
365 } | 365 } |
366 | 366 |
367 void setVertexBufferID(GrGpuGL* gpu, GrGLuint id) { | 367 void setVertexBufferID(GrGLGpu* gpu, GrGLuint id) { |
368 if (!fBoundVertexBufferIDIsValid || id != fBoundVertexBufferID) { | 368 if (!fBoundVertexBufferIDIsValid || id != fBoundVertexBufferID) { |
369 GR_GL_CALL(gpu->glInterface(), BindBuffer(GR_GL_ARRAY_BUFFER, id
)); | 369 GR_GL_CALL(gpu->glInterface(), BindBuffer(GR_GL_ARRAY_BUFFER, id
)); |
370 fBoundVertexBufferIDIsValid = true; | 370 fBoundVertexBufferIDIsValid = true; |
371 fBoundVertexBufferID = id; | 371 fBoundVertexBufferID = id; |
372 } | 372 } |
373 } | 373 } |
374 | 374 |
375 /** | 375 /** |
376 * Binds the default vertex array and binds the index buffer. This is us
ed when binding | 376 * Binds the default vertex array and binds the index buffer. This is us
ed when binding |
377 * an index buffer in order to update it. | 377 * an index buffer in order to update it. |
378 */ | 378 */ |
379 void setIndexBufferIDOnDefaultVertexArray(GrGpuGL* gpu, GrGLuint id) { | 379 void setIndexBufferIDOnDefaultVertexArray(GrGLGpu* gpu, GrGLuint id) { |
380 this->setVertexArrayID(gpu, 0); | 380 this->setVertexArrayID(gpu, 0); |
381 if (!fDefaultVertexArrayBoundIndexBufferIDIsValid || | 381 if (!fDefaultVertexArrayBoundIndexBufferIDIsValid || |
382 id != fDefaultVertexArrayBoundIndexBufferID) { | 382 id != fDefaultVertexArrayBoundIndexBufferID) { |
383 GR_GL_CALL(gpu->glInterface(), BindBuffer(GR_GL_ELEMENT_ARRAY_BU
FFER, id)); | 383 GR_GL_CALL(gpu->glInterface(), BindBuffer(GR_GL_ELEMENT_ARRAY_BU
FFER, id)); |
384 fDefaultVertexArrayBoundIndexBufferIDIsValid = true; | 384 fDefaultVertexArrayBoundIndexBufferIDIsValid = true; |
385 fDefaultVertexArrayBoundIndexBufferID = id; | 385 fDefaultVertexArrayBoundIndexBufferID = id; |
386 } | 386 } |
387 } | 387 } |
388 | 388 |
389 /** | 389 /** |
390 * Binds the vertex array object that should be used to render from the
vertex buffer. | 390 * Binds the vertex array object that should be used to render from the
vertex buffer. |
391 * The vertex array is bound and its attrib array state object is return
ed. The vertex | 391 * The vertex array is bound and its attrib array state object is return
ed. The vertex |
392 * buffer is bound. The index buffer (if non-NULL) is bound to the verte
x array. The | 392 * buffer is bound. The index buffer (if non-NULL) is bound to the verte
x array. The |
393 * returned GrGLAttribArrayState should be used to set vertex attribute
arrays. | 393 * returned GrGLAttribArrayState should be used to set vertex attribute
arrays. |
394 */ | 394 */ |
395 GrGLAttribArrayState* bindArrayAndBuffersToDraw(GrGpuGL* gpu, | 395 GrGLAttribArrayState* bindArrayAndBuffersToDraw(GrGLGpu* gpu, |
396 const GrGLVertexBuffer*
vbuffer, | 396 const GrGLVertexBuffer*
vbuffer, |
397 const GrGLIndexBuffer* i
buffer); | 397 const GrGLIndexBuffer* i
buffer); |
398 | 398 |
399 private: | 399 private: |
400 GrGLuint fBoundVertexArrayID; | 400 GrGLuint fBoundVertexArrayID; |
401 GrGLuint fBoundVertexBufferID; | 401 GrGLuint fBoundVertexBufferID; |
402 bool fBoundVertexArrayIDIsValid; | 402 bool fBoundVertexArrayIDIsValid; |
403 bool fBoundVertexBufferIDIsValid; | 403 bool fBoundVertexBufferIDIsValid; |
404 | 404 |
405 GrGLuint fDefaultVertexArrayBoundIndexBufferID; | 405 GrGLuint fDefaultVertexArrayBoundIndexBufferID; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 | 444 |
445 // we record what stencil format worked last time to hopefully exit early | 445 // we record what stencil format worked last time to hopefully exit early |
446 // from our loop that tries stencil formats and calls check fb status. | 446 // from our loop that tries stencil formats and calls check fb status. |
447 int fLastSuccessfulStencilFmtIdx; | 447 int fLastSuccessfulStencilFmtIdx; |
448 | 448 |
449 typedef GrGpu INHERITED; | 449 typedef GrGpu INHERITED; |
450 friend class GrGLPathRendering; // For accessing setTextureUnit. | 450 friend class GrGLPathRendering; // For accessing setTextureUnit. |
451 }; | 451 }; |
452 | 452 |
453 #endif | 453 #endif |
OLD | NEW |