OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "GrGpu.h" | 10 #include "GrGpu.h" |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 6, | 259 6, |
260 MAX_QUADS, | 260 MAX_QUADS, |
261 4); | 261 4); |
262 } | 262 } |
263 | 263 |
264 return fQuadIndexBuffer; | 264 return fQuadIndexBuffer; |
265 } | 265 } |
266 | 266 |
267 //////////////////////////////////////////////////////////////////////////////// | 267 //////////////////////////////////////////////////////////////////////////////// |
268 | 268 |
269 bool GrGpu::setupClipAndFlushState(DrawType type, | |
270 const GrDeviceCoordTexture* dstCopy, | |
271 const SkRect* devBounds, | |
272 GrDrawState::AutoRestoreEffects* are, | |
273 GrDrawState::AutoRestoreStencil* ars) { | |
274 GrClipMaskManager::ScissorState scissorState; | |
275 if (!fClipMaskManager.setupClipping(this->getClip(), | |
276 devBounds, | |
277 are, | |
278 ars, | |
279 &scissorState)) { | |
280 return false; | |
281 } | |
282 | |
283 if (!this->flushGraphicsState(type, scissorState, dstCopy)) { | |
284 return false; | |
285 } | |
286 | |
287 return true; | |
288 } | |
289 | |
290 //////////////////////////////////////////////////////////////////////////////// | |
291 | |
292 void GrGpu::geometrySourceWillPush() { | 269 void GrGpu::geometrySourceWillPush() { |
293 const GeometrySrcState& geoSrc = this->getGeomSrc(); | 270 const GeometrySrcState& geoSrc = this->getGeomSrc(); |
294 if (kArray_GeometrySrcType == geoSrc.fVertexSrc || | 271 if (kArray_GeometrySrcType == geoSrc.fVertexSrc || |
295 kReserved_GeometrySrcType == geoSrc.fVertexSrc) { | 272 kReserved_GeometrySrcType == geoSrc.fVertexSrc) { |
296 this->finalizeReservedVertices(); | 273 this->finalizeReservedVertices(); |
297 } | 274 } |
298 if (kArray_GeometrySrcType == geoSrc.fIndexSrc || | 275 if (kArray_GeometrySrcType == geoSrc.fIndexSrc || |
299 kReserved_GeometrySrcType == geoSrc.fIndexSrc) { | 276 kReserved_GeometrySrcType == geoSrc.fIndexSrc) { |
300 this->finalizeReservedIndices(); | 277 this->finalizeReservedIndices(); |
301 } | 278 } |
302 GeometryPoolState& newState = fGeomPoolStateStack.push_back(); | 279 GeometryPoolState& newState = fGeomPoolStateStack.push_back(); |
303 #ifdef SK_DEBUG | 280 #ifdef SK_DEBUG |
304 newState.fPoolVertexBuffer = (GrVertexBuffer*)DEBUG_INVAL_BUFFER; | 281 newState.fPoolVertexBuffer = (GrVertexBuffer*)DEBUG_INVAL_BUFFER; |
305 newState.fPoolStartVertex = DEBUG_INVAL_START_IDX; | 282 newState.fPoolStartVertex = DEBUG_INVAL_START_IDX; |
306 newState.fPoolIndexBuffer = (GrIndexBuffer*)DEBUG_INVAL_BUFFER; | 283 newState.fPoolIndexBuffer = (GrIndexBuffer*)DEBUG_INVAL_BUFFER; |
307 newState.fPoolStartIndex = DEBUG_INVAL_START_IDX; | 284 newState.fPoolStartIndex = DEBUG_INVAL_START_IDX; |
308 #else | 285 #else |
309 (void) newState; // silence compiler warning | 286 (void) newState; // silence compiler warning |
310 #endif | 287 #endif |
311 } | 288 } |
312 | 289 |
313 void GrGpu::geometrySourceWillPop(const GeometrySrcState& restoredState) { | 290 void GrGpu::geometrySourceWillPop(const GeometrySrcState& restoredState) { |
314 // if popping last entry then pops are unbalanced with pushes | 291 // if popping last entry then pops are unbalanced with pushes |
315 SkASSERT(fGeomPoolStateStack.count() > 1); | 292 SkASSERT(fGeomPoolStateStack.count() > 1); |
316 fGeomPoolStateStack.pop_back(); | 293 fGeomPoolStateStack.pop_back(); |
317 } | 294 } |
318 | 295 |
319 void GrGpu::onDraw(const DrawInfo& info) { | 296 void GrGpu::onDraw(const DrawInfo& info, const GrClipMaskManager::ScissorState&
scissorState) { |
320 this->handleDirtyContext(); | 297 this->handleDirtyContext(); |
321 GrDrawState::AutoRestoreEffects are; | 298 if (!this->flushGraphicsState(PrimTypeToDrawType(info.primitiveType()), |
322 GrDrawState::AutoRestoreStencil ars; | 299 scissorState, |
323 if (!this->setupClipAndFlushState(PrimTypeToDrawType(info.primitiveType()), | 300 info.getDstCopy())) { |
324 info.getDstCopy(), | |
325 info.getDevBounds(), | |
326 &are, | |
327 &ars)) { | |
328 return; | 301 return; |
329 } | 302 } |
330 this->onGpuDraw(info); | 303 this->onGpuDraw(info); |
331 } | 304 } |
332 | 305 |
333 | 306 void GrGpu::onStencilPath(const GrPath* path, |
334 // TODO hack | 307 const GrClipMaskManager::ScissorState& scissorState, |
335 static const GrStencilSettings& winding_path_stencil_settings() { | 308 const GrStencilSettings& stencilSettings) { |
336 GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, | |
337 kIncClamp_StencilOp, | |
338 kIncClamp_StencilOp, | |
339 kAlwaysIfInClip_StencilFunc, | |
340 0xFFFF, 0xFFFF, 0xFFFF); | |
341 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); | |
342 } | |
343 | |
344 static const GrStencilSettings& even_odd_path_stencil_settings() { | |
345 GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, | |
346 kInvert_StencilOp, | |
347 kInvert_StencilOp, | |
348 kAlwaysIfInClip_StencilFunc, | |
349 0xFFFF, 0xFFFF, 0xFFFF); | |
350 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); | |
351 } | |
352 | |
353 static void get_path_stencil_settings_for_filltype(GrPathRendering::FillType fil
l, | |
354 GrStencilSettings* outStencil
Settings) { | |
355 | |
356 switch (fill) { | |
357 default: | |
358 SkFAIL("Unexpected path fill."); | |
359 case GrPathRendering::kWinding_FillType: | |
360 *outStencilSettings = winding_path_stencil_settings(); | |
361 break; | |
362 case GrPathRendering::kEvenOdd_FillType: | |
363 *outStencilSettings = even_odd_path_stencil_settings(); | |
364 break; | |
365 } | |
366 } | |
367 | |
368 void GrGpu::onStencilPath(const GrPath* path, GrPathRendering::FillType fill) { | |
369 this->handleDirtyContext(); | 309 this->handleDirtyContext(); |
370 | 310 |
371 GrDrawState::AutoRestoreEffects are; | 311 if (!this->flushGraphicsState(kStencilPath_DrawType, scissorState, NULL)) { |
372 GrDrawState::AutoRestoreStencil ars; | |
373 if (!this->setupClipAndFlushState(kStencilPath_DrawType, NULL, NULL, &are, &
ars)) { | |
374 return; | 312 return; |
375 } | 313 } |
376 | 314 |
377 GrStencilSettings stencilSettings; | |
378 get_path_stencil_settings_for_filltype(fill, &stencilSettings); | |
379 fClipMaskManager.adjustPathStencilParams(&stencilSettings); | |
380 | |
381 this->pathRendering()->stencilPath(path, stencilSettings); | 315 this->pathRendering()->stencilPath(path, stencilSettings); |
382 } | 316 } |
383 | 317 |
384 | 318 |
385 void GrGpu::onDrawPath(const GrPath* path, GrPathRendering::FillType fill, | 319 void GrGpu::onDrawPath(const GrPath* path, |
| 320 const GrClipMaskManager::ScissorState& scissorState, |
| 321 const GrStencilSettings& stencilSettings, |
386 const GrDeviceCoordTexture* dstCopy) { | 322 const GrDeviceCoordTexture* dstCopy) { |
387 this->handleDirtyContext(); | 323 this->handleDirtyContext(); |
388 | 324 |
389 drawState()->setDefaultVertexAttribs(); | 325 drawState()->setDefaultVertexAttribs(); |
390 | 326 |
391 GrDrawState::AutoRestoreEffects are; | 327 if (!this->flushGraphicsState(kDrawPath_DrawType, scissorState, dstCopy)) { |
392 GrDrawState::AutoRestoreStencil ars; | |
393 if (!this->setupClipAndFlushState(kDrawPath_DrawType, dstCopy, NULL, &are, &
ars)) { | |
394 return; | 328 return; |
395 } | 329 } |
396 | 330 |
397 GrStencilSettings stencilSettings; | |
398 get_path_stencil_settings_for_filltype(fill, &stencilSettings); | |
399 fClipMaskManager.adjustPathStencilParams(&stencilSettings); | |
400 | |
401 this->pathRendering()->drawPath(path, stencilSettings); | 331 this->pathRendering()->drawPath(path, stencilSettings); |
402 } | 332 } |
403 | 333 |
404 void GrGpu::onDrawPaths(const GrPathRange* pathRange, | 334 void GrGpu::onDrawPaths(const GrPathRange* pathRange, |
405 const uint32_t indices[], int count, | 335 const uint32_t indices[], |
406 const float transforms[], PathTransformType transformsTy
pe, | 336 int count, |
407 GrPathRendering::FillType fill, const GrDeviceCoordTextu
re* dstCopy) { | 337 const float transforms[], |
| 338 PathTransformType transformsType, |
| 339 const GrClipMaskManager::ScissorState& scissorState, |
| 340 const GrStencilSettings& stencilSettings, |
| 341 const GrDeviceCoordTexture* dstCopy) { |
408 this->handleDirtyContext(); | 342 this->handleDirtyContext(); |
409 | 343 |
410 drawState()->setDefaultVertexAttribs(); | 344 drawState()->setDefaultVertexAttribs(); |
411 | 345 |
412 GrDrawState::AutoRestoreEffects are; | 346 if (!this->flushGraphicsState(kDrawPaths_DrawType, scissorState, dstCopy)) { |
413 GrDrawState::AutoRestoreStencil ars; | |
414 if (!this->setupClipAndFlushState(kDrawPaths_DrawType, dstCopy, NULL, &are,
&ars)) { | |
415 return; | 347 return; |
416 } | 348 } |
417 | 349 |
418 GrStencilSettings stencilSettings; | |
419 get_path_stencil_settings_for_filltype(fill, &stencilSettings); | |
420 fClipMaskManager.adjustPathStencilParams(&stencilSettings); | |
421 | |
422 pathRange->willDrawPaths(indices, count); | 350 pathRange->willDrawPaths(indices, count); |
423 this->pathRendering()->drawPaths(pathRange, indices, count, transforms, tran
sformsType, | 351 this->pathRendering()->drawPaths(pathRange, indices, count, transforms, tran
sformsType, |
424 stencilSettings); | 352 stencilSettings); |
425 } | 353 } |
426 | 354 |
427 void GrGpu::finalizeReservedVertices() { | 355 void GrGpu::finalizeReservedVertices() { |
428 SkASSERT(fVertexPool); | 356 SkASSERT(fVertexPool); |
429 fVertexPool->unmap(); | 357 fVertexPool->unmap(); |
430 } | 358 } |
431 | 359 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 } | 482 } |
555 | 483 |
556 void GrGpu::releaseIndexArray() { | 484 void GrGpu::releaseIndexArray() { |
557 // if index source was array, we stowed data in the pool | 485 // if index source was array, we stowed data in the pool |
558 const GeometrySrcState& geoSrc = this->getGeomSrc(); | 486 const GeometrySrcState& geoSrc = this->getGeomSrc(); |
559 SkASSERT(kArray_GeometrySrcType == geoSrc.fIndexSrc); | 487 SkASSERT(kArray_GeometrySrcType == geoSrc.fIndexSrc); |
560 size_t bytes = geoSrc.fIndexCount * sizeof(uint16_t); | 488 size_t bytes = geoSrc.fIndexCount * sizeof(uint16_t); |
561 fIndexPool->putBack(bytes); | 489 fIndexPool->putBack(bytes); |
562 --fIndexPoolUseCnt; | 490 --fIndexPoolUseCnt; |
563 } | 491 } |
OLD | NEW |