Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(404)

Side by Side Diff: src/gpu/GrContext.cpp

Issue 16952006: Replace fixed-size array of effect stages in GrDrawState with two appendable arrays, one for color,… (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: fix comments Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/gpu/GrClipMaskManager.cpp ('k') | src/gpu/GrDrawState.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 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 "GrContext.h" 10 #include "GrContext.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 static const size_t MAX_TEXTURE_CACHE_BYTES = GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT * 1024 * 1024; 59 static const size_t MAX_TEXTURE_CACHE_BYTES = GR_DEFAULT_TEXTURE_CACHE_MB_LIMIT * 1024 * 1024;
60 60
61 static const size_t DRAW_BUFFER_VBPOOL_BUFFER_SIZE = 1 << 15; 61 static const size_t DRAW_BUFFER_VBPOOL_BUFFER_SIZE = 1 << 15;
62 static const int DRAW_BUFFER_VBPOOL_PREALLOC_BUFFERS = 4; 62 static const int DRAW_BUFFER_VBPOOL_PREALLOC_BUFFERS = 4;
63 63
64 static const size_t DRAW_BUFFER_IBPOOL_BUFFER_SIZE = 1 << 11; 64 static const size_t DRAW_BUFFER_IBPOOL_BUFFER_SIZE = 1 << 11;
65 static const int DRAW_BUFFER_IBPOOL_PREALLOC_BUFFERS = 4; 65 static const int DRAW_BUFFER_IBPOOL_PREALLOC_BUFFERS = 4;
66 66
67 #define ASSERT_OWNED_RESOURCE(R) GrAssert(!(R) || (R)->getContext() == this) 67 #define ASSERT_OWNED_RESOURCE(R) GrAssert(!(R) || (R)->getContext() == this)
68 68
69 // Glorified typedef to avoid including GrDrawState.h in GrContext.h
70 class GrContext::AutoRestoreEffects : public GrDrawState::AutoRestoreEffects {};
71
69 GrContext* GrContext::Create(GrBackend backend, GrBackendContext backendContext) { 72 GrContext* GrContext::Create(GrBackend backend, GrBackendContext backendContext) {
70 GrContext* context = SkNEW(GrContext); 73 GrContext* context = SkNEW(GrContext);
71 if (context->init(backend, backendContext)) { 74 if (context->init(backend, backendContext)) {
72 return context; 75 return context;
73 } else { 76 } else {
74 context->unref(); 77 context->unref();
75 return NULL; 78 return NULL;
76 } 79 }
77 } 80 }
78 81
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 int radius, 255 int radius,
253 Gr1DKernelEffect::Direction direction) { 256 Gr1DKernelEffect::Direction direction) {
254 GrRenderTarget* rt = target->drawState()->getRenderTarget(); 257 GrRenderTarget* rt = target->drawState()->getRenderTarget();
255 GrDrawTarget::AutoStateRestore asr(target, GrDrawTarget::kReset_ASRInit); 258 GrDrawTarget::AutoStateRestore asr(target, GrDrawTarget::kReset_ASRInit);
256 GrDrawState* drawState = target->drawState(); 259 GrDrawState* drawState = target->drawState();
257 drawState->setRenderTarget(rt); 260 drawState->setRenderTarget(rt);
258 SkAutoTUnref<GrEffectRef> conv(GrConvolutionEffect::CreateGaussian(texture, 261 SkAutoTUnref<GrEffectRef> conv(GrConvolutionEffect::CreateGaussian(texture,
259 direction , 262 direction ,
260 radius, 263 radius,
261 sigma)); 264 sigma));
262 drawState->setEffect(0, conv); 265 drawState->addColorEffect(conv);
263 target->drawSimpleRect(rect, NULL); 266 target->drawSimpleRect(rect, NULL);
264 } 267 }
265 268
266 } 269 }
267 270
268 //////////////////////////////////////////////////////////////////////////////// 271 ////////////////////////////////////////////////////////////////////////////////
269 272
270 GrTexture* GrContext::findAndRefTexture(const GrTextureDesc& desc, 273 GrTexture* GrContext::findAndRefTexture(const GrTextureDesc& desc,
271 const GrCacheID& cacheID, 274 const GrCacheID& cacheID,
272 const GrTextureParams* params) { 275 const GrTextureParams* params) {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 368
366 if (NULL != texture) { 369 if (NULL != texture) {
367 GrDrawTarget::AutoStateRestore asr(fGpu, GrDrawTarget::kReset_ASRInit); 370 GrDrawTarget::AutoStateRestore asr(fGpu, GrDrawTarget::kReset_ASRInit);
368 GrDrawState* drawState = fGpu->drawState(); 371 GrDrawState* drawState = fGpu->drawState();
369 drawState->setRenderTarget(texture->asRenderTarget()); 372 drawState->setRenderTarget(texture->asRenderTarget());
370 373
371 // if filtering is not desired then we want to ensure all 374 // if filtering is not desired then we want to ensure all
372 // texels in the resampled image are copies of texels from 375 // texels in the resampled image are copies of texels from
373 // the original. 376 // the original.
374 GrTextureParams params(SkShader::kClamp_TileMode, needsFiltering); 377 GrTextureParams params(SkShader::kClamp_TileMode, needsFiltering);
375 drawState->createTextureEffect(0, clampedTexture, SkMatrix::I(), params) ; 378 drawState->addColorTextureEffect(clampedTexture, SkMatrix::I(), params);
376 379
377 drawState->setVertexAttribs<gVertexAttribs>(SK_ARRAY_COUNT(gVertexAttrib s)); 380 drawState->setVertexAttribs<gVertexAttribs>(SK_ARRAY_COUNT(gVertexAttrib s));
378 381
379 GrDrawTarget::AutoReleaseGeometry arg(fGpu, 4, 0); 382 GrDrawTarget::AutoReleaseGeometry arg(fGpu, 4, 0);
380 383
381 if (arg.succeeded()) { 384 if (arg.succeeded()) {
382 GrPoint* verts = (GrPoint*) arg.vertices(); 385 GrPoint* verts = (GrPoint*) arg.vertices();
383 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 * sizeof(GrPoint)); 386 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 * sizeof(GrPoint));
384 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(GrPoint)); 387 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(GrPoint));
385 fGpu->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4); 388 fGpu->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4);
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 } 598 }
596 return true; 599 return true;
597 } 600 }
598 601
599 602
600 //////////////////////////////////////////////////////////////////////////////// 603 ////////////////////////////////////////////////////////////////////////////////
601 604
602 void GrContext::clear(const GrIRect* rect, 605 void GrContext::clear(const GrIRect* rect,
603 const GrColor color, 606 const GrColor color,
604 GrRenderTarget* target) { 607 GrRenderTarget* target) {
605 this->prepareToDraw(NULL, BUFFERED_DRAW)->clear(rect, color, target); 608 AutoRestoreEffects are;
609 this->prepareToDraw(NULL, BUFFERED_DRAW, &are)->clear(rect, color, target);
606 } 610 }
607 611
608 void GrContext::drawPaint(const GrPaint& origPaint) { 612 void GrContext::drawPaint(const GrPaint& origPaint) {
609 // set rect to be big enough to fill the space, but not super-huge, so we 613 // set rect to be big enough to fill the space, but not super-huge, so we
610 // don't overflow fixed-point implementations 614 // don't overflow fixed-point implementations
611 GrRect r; 615 GrRect r;
612 r.setLTRB(0, 0, 616 r.setLTRB(0, 0,
613 SkIntToScalar(getRenderTarget()->width()), 617 SkIntToScalar(getRenderTarget()->width()),
614 SkIntToScalar(getRenderTarget()->height())); 618 SkIntToScalar(getRenderTarget()->height()));
615 SkMatrix inverse; 619 SkMatrix inverse;
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 return true; 762 return true;
759 } 763 }
760 } 764 }
761 765
762 void GrContext::drawRect(const GrPaint& paint, 766 void GrContext::drawRect(const GrPaint& paint,
763 const GrRect& rect, 767 const GrRect& rect,
764 SkScalar width, 768 SkScalar width,
765 const SkMatrix* matrix) { 769 const SkMatrix* matrix) {
766 SK_TRACE_EVENT0("GrContext::drawRect"); 770 SK_TRACE_EVENT0("GrContext::drawRect");
767 771
768 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); 772 AutoRestoreEffects are;
769 GrDrawState::AutoStageDisable atr(fDrawState); 773 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are);
770 774
771 GrRect devRect; 775 GrRect devRect;
772 SkMatrix combinedMatrix; 776 SkMatrix combinedMatrix;
773 bool useVertexCoverage; 777 bool useVertexCoverage;
774 bool needAA = paint.isAntiAlias() && 778 bool needAA = paint.isAntiAlias() &&
775 !target->getDrawState().getRenderTarget()->isMultisampled(); 779 !target->getDrawState().getRenderTarget()->isMultisampled();
776 bool doAA = needAA && apply_aa_to_rect(target, rect, width, matrix, 780 bool doAA = needAA && apply_aa_to_rect(target, rect, width, matrix,
777 &combinedMatrix, &devRect, 781 &combinedMatrix, &devRect,
778 &useVertexCoverage); 782 &useVertexCoverage);
779 if (doAA) { 783 if (doAA) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 target->drawSimpleRect(rect, matrix); 843 target->drawSimpleRect(rect, matrix);
840 } 844 }
841 } 845 }
842 846
843 void GrContext::drawRectToRect(const GrPaint& paint, 847 void GrContext::drawRectToRect(const GrPaint& paint,
844 const GrRect& dstRect, 848 const GrRect& dstRect,
845 const GrRect& localRect, 849 const GrRect& localRect,
846 const SkMatrix* dstMatrix, 850 const SkMatrix* dstMatrix,
847 const SkMatrix* localMatrix) { 851 const SkMatrix* localMatrix) {
848 SK_TRACE_EVENT0("GrContext::drawRectToRect"); 852 SK_TRACE_EVENT0("GrContext::drawRectToRect");
849 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); 853 AutoRestoreEffects are;
850 GrDrawState::AutoStageDisable atr(fDrawState); 854 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are);
851 855
852 target->drawRect(dstRect, dstMatrix, &localRect, localMatrix); 856 target->drawRect(dstRect, dstMatrix, &localRect, localMatrix);
853 } 857 }
854 858
855 namespace { 859 namespace {
856 860
857 extern const GrVertexAttrib gPosUVColorAttribs[] = { 861 extern const GrVertexAttrib gPosUVColorAttribs[] = {
858 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding }, 862 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding },
859 {kVec2f_GrVertexAttribType, sizeof(GrPoint), kLocalCoord_GrVertexAttribBind ing }, 863 {kVec2f_GrVertexAttribType, sizeof(GrPoint), kLocalCoord_GrVertexAttribBind ing },
860 {kVec4ub_GrVertexAttribType, 2*sizeof(GrPoint), kColor_GrVertexAttribBinding } 864 {kVec4ub_GrVertexAttribType, 2*sizeof(GrPoint), kColor_GrVertexAttribBinding }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
895 int vertexCount, 899 int vertexCount,
896 const GrPoint positions[], 900 const GrPoint positions[],
897 const GrPoint texCoords[], 901 const GrPoint texCoords[],
898 const GrColor colors[], 902 const GrColor colors[],
899 const uint16_t indices[], 903 const uint16_t indices[],
900 int indexCount) { 904 int indexCount) {
901 SK_TRACE_EVENT0("GrContext::drawVertices"); 905 SK_TRACE_EVENT0("GrContext::drawVertices");
902 906
903 GrDrawTarget::AutoReleaseGeometry geo; 907 GrDrawTarget::AutoReleaseGeometry geo;
904 908
905 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); 909 AutoRestoreEffects are;
906 GrDrawState::AutoStageDisable atr(fDrawState); 910 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are);
907 911
908 GrDrawState* drawState = target->drawState(); 912 GrDrawState* drawState = target->drawState();
909 913
910 int colorOffset = -1, texOffset = -1; 914 int colorOffset = -1, texOffset = -1;
911 set_vertex_attributes(drawState, texCoords, colors, &colorOffset, &texOffset ); 915 set_vertex_attributes(drawState, texCoords, colors, &colorOffset, &texOffset );
912 916
913 size_t vertexSize = drawState->getVertexSize(); 917 size_t vertexSize = drawState->getVertexSize();
914 if (sizeof(GrPoint) != vertexSize) { 918 if (sizeof(GrPoint) != vertexSize) {
915 if (!geo.set(target, vertexCount, 0)) { 919 if (!geo.set(target, vertexCount, 0)) {
916 GrPrintf("Failed to get space for vertices!\n"); 920 GrPrintf("Failed to get space for vertices!\n");
(...skipping 27 matching lines...) Expand all
944 target->drawNonIndexed(primitiveType, 0, vertexCount); 948 target->drawNonIndexed(primitiveType, 0, vertexCount);
945 } 949 }
946 } 950 }
947 951
948 /////////////////////////////////////////////////////////////////////////////// 952 ///////////////////////////////////////////////////////////////////////////////
949 953
950 void GrContext::drawRRect(const GrPaint& paint, 954 void GrContext::drawRRect(const GrPaint& paint,
951 const SkRRect& rect, 955 const SkRRect& rect,
952 const SkStrokeRec& stroke) { 956 const SkStrokeRec& stroke) {
953 957
954 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); 958 AutoRestoreEffects are;
955 GrDrawState::AutoStageDisable atr(fDrawState); 959 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are);
956 960
957 bool useAA = paint.isAntiAlias() && 961 bool useAA = paint.isAntiAlias() &&
958 !target->getDrawState().getRenderTarget()->isMultisampled() && 962 !target->getDrawState().getRenderTarget()->isMultisampled() &&
959 !disable_coverage_aa_for_blend(target); 963 !disable_coverage_aa_for_blend(target);
960 964
961 if (!fOvalRenderer->drawSimpleRRect(target, this, useAA, rect, stroke)) { 965 if (!fOvalRenderer->drawSimpleRRect(target, this, useAA, rect, stroke)) {
962 SkPath path; 966 SkPath path;
963 path.addRRect(rect); 967 path.addRRect(rect);
964 this->internalDrawPath(target, useAA, path, stroke); 968 this->internalDrawPath(target, useAA, path, stroke);
965 } 969 }
966 } 970 }
967 971
968 /////////////////////////////////////////////////////////////////////////////// 972 ///////////////////////////////////////////////////////////////////////////////
969 973
970 void GrContext::drawOval(const GrPaint& paint, 974 void GrContext::drawOval(const GrPaint& paint,
971 const GrRect& oval, 975 const GrRect& oval,
972 const SkStrokeRec& stroke) { 976 const SkStrokeRec& stroke) {
973 977
974 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); 978 AutoRestoreEffects are;
975 GrDrawState::AutoStageDisable atr(fDrawState); 979 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are);
976 980
977 bool useAA = paint.isAntiAlias() && 981 bool useAA = paint.isAntiAlias() &&
978 !target->getDrawState().getRenderTarget()->isMultisampled() && 982 !target->getDrawState().getRenderTarget()->isMultisampled() &&
979 !disable_coverage_aa_for_blend(target); 983 !disable_coverage_aa_for_blend(target);
980 984
981 if (!fOvalRenderer->drawOval(target, this, useAA, oval, stroke)) { 985 if (!fOvalRenderer->drawOval(target, this, useAA, oval, stroke)) {
982 SkPath path; 986 SkPath path;
983 path.addOval(oval); 987 path.addOval(oval);
984 this->internalDrawPath(target, useAA, path, stroke); 988 this->internalDrawPath(target, useAA, path, stroke);
985 } 989 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 this->drawPaint(paint); 1042 this->drawPaint(paint);
1039 } 1043 }
1040 return; 1044 return;
1041 } 1045 }
1042 1046
1043 // Note that internalDrawPath may sw-rasterize the path into a scratch textu re. 1047 // Note that internalDrawPath may sw-rasterize the path into a scratch textu re.
1044 // Scratch textures can be recycled after they are returned to the texture 1048 // Scratch textures can be recycled after they are returned to the texture
1045 // cache. This presents a potential hazard for buffered drawing. However, 1049 // cache. This presents a potential hazard for buffered drawing. However,
1046 // the writePixels that uploads to the scratch will perform a flush so we're 1050 // the writePixels that uploads to the scratch will perform a flush so we're
1047 // OK. 1051 // OK.
1048 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); 1052 AutoRestoreEffects are;
1049 GrDrawState::AutoStageDisable atr(fDrawState); 1053 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are);
1050 1054
1051 bool useAA = paint.isAntiAlias() && !target->getDrawState().getRenderTarget( )->isMultisampled(); 1055 bool useAA = paint.isAntiAlias() && !target->getDrawState().getRenderTarget( )->isMultisampled();
1052 if (useAA && stroke.getWidth() < 0 && !path.isConvex()) { 1056 if (useAA && stroke.getWidth() < 0 && !path.isConvex()) {
1053 // Concave AA paths are expensive - try to avoid them for special cases 1057 // Concave AA paths are expensive - try to avoid them for special cases
1054 bool useVertexCoverage; 1058 bool useVertexCoverage;
1055 SkRect rects[2]; 1059 SkRect rects[2];
1056 1060
1057 if (is_nested_rects(target, path, stroke, rects, &useVertexCoverage)) { 1061 if (is_nested_rects(target, path, stroke, rects, &useVertexCoverage)) {
1058 SkMatrix origViewMatrix = target->getDrawState().getViewMatrix(); 1062 SkMatrix origViewMatrix = target->getDrawState().getViewMatrix();
1059 GrDrawState::AutoViewMatrixRestore avmr; 1063 GrDrawState::AutoViewMatrixRestore avmr;
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
1339 textureMatrix)); 1343 textureMatrix));
1340 } 1344 }
1341 swapRAndB = false; // we will handle the swap in the draw. 1345 swapRAndB = false; // we will handle the swap in the draw.
1342 1346
1343 // We protect the existing geometry here since it may not be 1347 // We protect the existing geometry here since it may not be
1344 // clear to the caller that a draw operation (i.e., drawSimpleRe ct) 1348 // clear to the caller that a draw operation (i.e., drawSimpleRe ct)
1345 // can be invoked in this method 1349 // can be invoked in this method
1346 GrDrawTarget::AutoGeometryAndStatePush agasp(fGpu, GrDrawTarget: :kReset_ASRInit); 1350 GrDrawTarget::AutoGeometryAndStatePush agasp(fGpu, GrDrawTarget: :kReset_ASRInit);
1347 GrDrawState* drawState = fGpu->drawState(); 1351 GrDrawState* drawState = fGpu->drawState();
1348 GrAssert(effect); 1352 GrAssert(effect);
1349 drawState->setEffect(0, effect); 1353 drawState->addColorEffect(effect);
1350 1354
1351 drawState->setRenderTarget(texture->asRenderTarget()); 1355 drawState->setRenderTarget(texture->asRenderTarget());
1352 GrRect rect = GrRect::MakeWH(SkIntToScalar(width), SkIntToScalar (height)); 1356 GrRect rect = GrRect::MakeWH(SkIntToScalar(width), SkIntToScalar (height));
1353 fGpu->drawSimpleRect(rect, NULL); 1357 fGpu->drawSimpleRect(rect, NULL);
1354 // we want to read back from the scratch's origin 1358 // we want to read back from the scratch's origin
1355 left = 0; 1359 left = 0;
1356 top = 0; 1360 top = 0;
1357 target = texture->asRenderTarget(); 1361 target = texture->asRenderTarget();
1358 } 1362 }
1359 } 1363 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1414 sampleM.setIDiv(src->width(), src->height()); 1418 sampleM.setIDiv(src->width(), src->height());
1415 SkIRect srcRect = SkIRect::MakeWH(dst->width(), dst->height()); 1419 SkIRect srcRect = SkIRect::MakeWH(dst->width(), dst->height());
1416 if (NULL != topLeft) { 1420 if (NULL != topLeft) {
1417 srcRect.offset(*topLeft); 1421 srcRect.offset(*topLeft);
1418 } 1422 }
1419 SkIRect srcBounds = SkIRect::MakeWH(src->width(), src->height()); 1423 SkIRect srcBounds = SkIRect::MakeWH(src->width(), src->height());
1420 if (!srcRect.intersect(srcBounds)) { 1424 if (!srcRect.intersect(srcBounds)) {
1421 return; 1425 return;
1422 } 1426 }
1423 sampleM.preTranslate(SkIntToScalar(srcRect.fLeft), SkIntToScalar(srcRect.fTo p)); 1427 sampleM.preTranslate(SkIntToScalar(srcRect.fLeft), SkIntToScalar(srcRect.fTo p));
1424 drawState->createTextureEffect(0, src, sampleM); 1428 drawState->addColorTextureEffect(src, sampleM);
1425 SkRect dstR = SkRect::MakeWH(SkIntToScalar(srcRect.width()), SkIntToScalar(s rcRect.height())); 1429 SkRect dstR = SkRect::MakeWH(SkIntToScalar(srcRect.width()), SkIntToScalar(s rcRect.height()));
1426 fGpu->drawSimpleRect(dstR, NULL); 1430 fGpu->drawSimpleRect(dstR, NULL);
1427 } 1431 }
1428 1432
1429 bool GrContext::writeRenderTargetPixels(GrRenderTarget* target, 1433 bool GrContext::writeRenderTargetPixels(GrRenderTarget* target,
1430 int left, int top, int width, int height , 1434 int left, int top, int width, int height ,
1431 GrPixelConfig srcConfig, 1435 GrPixelConfig srcConfig,
1432 const void* buffer, 1436 const void* buffer,
1433 size_t rowBytes, 1437 size_t rowBytes,
1434 uint32_t flags) { 1438 uint32_t flags) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1532 } 1536 }
1533 1537
1534 // writeRenderTargetPixels can be called in the midst of drawing another 1538 // writeRenderTargetPixels can be called in the midst of drawing another
1535 // object (e.g., when uploading a SW path rendering to the gpu while 1539 // object (e.g., when uploading a SW path rendering to the gpu while
1536 // drawing a rect) so preserve the current geometry. 1540 // drawing a rect) so preserve the current geometry.
1537 SkMatrix matrix; 1541 SkMatrix matrix;
1538 matrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top)); 1542 matrix.setTranslate(SkIntToScalar(left), SkIntToScalar(top));
1539 GrDrawTarget::AutoGeometryAndStatePush agasp(fGpu, GrDrawTarget::kReset_ASRI nit, &matrix); 1543 GrDrawTarget::AutoGeometryAndStatePush agasp(fGpu, GrDrawTarget::kReset_ASRI nit, &matrix);
1540 GrDrawState* drawState = fGpu->drawState(); 1544 GrDrawState* drawState = fGpu->drawState();
1541 GrAssert(effect); 1545 GrAssert(effect);
1542 drawState->setEffect(0, effect); 1546 drawState->addColorEffect(effect);
1543 1547
1544 drawState->setRenderTarget(target); 1548 drawState->setRenderTarget(target);
1545 1549
1546 fGpu->drawSimpleRect(GrRect::MakeWH(SkIntToScalar(width), SkIntToScalar(heig ht)), NULL); 1550 fGpu->drawSimpleRect(GrRect::MakeWH(SkIntToScalar(width), SkIntToScalar(heig ht)), NULL);
1547 return true; 1551 return true;
1548 } 1552 }
1549 //////////////////////////////////////////////////////////////////////////////// 1553 ////////////////////////////////////////////////////////////////////////////////
1550 1554
1551 GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint, BufferedDraw buffer ed) { 1555 GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint,
1556 BufferedDraw buffered,
1557 AutoRestoreEffects* are) {
1558 // All users of this draw state should be freeing up all effects when they'r e done.
1559 // Otherwise effects that own resources may keep those resources alive indef initely.
1560 GrAssert(0 == fDrawState->numColorStages() && 0 == fDrawState->numCoverageSt ages());
1561
1552 if (kNo_BufferedDraw == buffered && kYes_BufferedDraw == fLastDrawWasBuffere d) { 1562 if (kNo_BufferedDraw == buffered && kYes_BufferedDraw == fLastDrawWasBuffere d) {
1553 this->flushDrawBuffer(); 1563 this->flushDrawBuffer();
1554 fLastDrawWasBuffered = kNo_BufferedDraw; 1564 fLastDrawWasBuffered = kNo_BufferedDraw;
1555 } 1565 }
1556 ASSERT_OWNED_RESOURCE(fRenderTarget.get()); 1566 ASSERT_OWNED_RESOURCE(fRenderTarget.get());
1557 if (NULL != paint) { 1567 if (NULL != paint) {
1558 GrAssert(fDrawState->stagesDisabled()); 1568 GrAssert(NULL != are);
1569 are->set(fDrawState);
1559 fDrawState->setFromPaint(*paint, fViewMatrix, fRenderTarget.get()); 1570 fDrawState->setFromPaint(*paint, fViewMatrix, fRenderTarget.get());
1560 #if GR_DEBUG_PARTIAL_COVERAGE_CHECK 1571 #if GR_DEBUG_PARTIAL_COVERAGE_CHECK
1561 if ((paint->hasMask() || 0xff != paint->fCoverage) && 1572 if ((paint->hasMask() || 0xff != paint->fCoverage) &&
1562 !fGpu->canApplyCoverage()) { 1573 !fGpu->canApplyCoverage()) {
1563 GrPrintf("Partial pixel coverage will be incorrectly blended.\n"); 1574 GrPrintf("Partial pixel coverage will be incorrectly blended.\n");
1564 } 1575 }
1565 #endif 1576 #endif
1566 } else { 1577 } else {
1567 fDrawState->reset(fViewMatrix); 1578 fDrawState->reset(fViewMatrix);
1568 fDrawState->setRenderTarget(fRenderTarget.get()); 1579 fDrawState->setRenderTarget(fRenderTarget.get());
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1648 DRAW_BUFFER_IBPOOL_PREALLOC_BUFFERS)); 1659 DRAW_BUFFER_IBPOOL_PREALLOC_BUFFERS));
1649 1660
1650 fDrawBuffer = SkNEW_ARGS(GrInOrderDrawBuffer, (fGpu, 1661 fDrawBuffer = SkNEW_ARGS(GrInOrderDrawBuffer, (fGpu,
1651 fDrawBufferVBAllocPool, 1662 fDrawBufferVBAllocPool,
1652 fDrawBufferIBAllocPool)); 1663 fDrawBufferIBAllocPool));
1653 1664
1654 fDrawBuffer->setDrawState(fDrawState); 1665 fDrawBuffer->setDrawState(fDrawState);
1655 } 1666 }
1656 1667
1657 GrDrawTarget* GrContext::getTextTarget() { 1668 GrDrawTarget* GrContext::getTextTarget() {
1658 return this->prepareToDraw(NULL, BUFFERED_DRAW); 1669 return this->prepareToDraw(NULL, BUFFERED_DRAW, NULL);
1659 } 1670 }
1660 1671
1661 const GrIndexBuffer* GrContext::getQuadIndexBuffer() const { 1672 const GrIndexBuffer* GrContext::getQuadIndexBuffer() const {
1662 return fGpu->getQuadIndexBuffer(); 1673 return fGpu->getQuadIndexBuffer();
1663 } 1674 }
1664 1675
1665 namespace { 1676 namespace {
1666 void test_pm_conversions(GrContext* ctx, int* pmToUPMValue, int* upmToPMValue) { 1677 void test_pm_conversions(GrContext* ctx, int* pmToUPMValue, int* upmToPMValue) {
1667 GrConfigConversionEffect::PMConversion pmToUPM; 1678 GrConfigConversionEffect::PMConversion pmToUPM;
1668 GrConfigConversionEffect::PMConversion upmToPM; 1679 GrConfigConversionEffect::PMConversion upmToPM;
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1772 if (sigmaX > 0.0f) { 1783 if (sigmaX > 0.0f) {
1773 if (scaleFactorX > 1) { 1784 if (scaleFactorX > 1) {
1774 // Clear out a radius to the right of the srcRect to prevent the 1785 // Clear out a radius to the right of the srcRect to prevent the
1775 // X convolution from reading garbage. 1786 // X convolution from reading garbage.
1776 clearRect = SkIRect::MakeXYWH(srcIRect.fRight, srcIRect.fTop, 1787 clearRect = SkIRect::MakeXYWH(srcIRect.fRight, srcIRect.fTop,
1777 radiusX, srcIRect.height()); 1788 radiusX, srcIRect.height());
1778 this->clear(&clearRect, 0x0); 1789 this->clear(&clearRect, 0x0);
1779 } 1790 }
1780 1791
1781 this->setRenderTarget(dstTexture->asRenderTarget()); 1792 this->setRenderTarget(dstTexture->asRenderTarget());
1782 GrDrawTarget* target = this->prepareToDraw(NULL, BUFFERED_DRAW); 1793 AutoRestoreEffects are;
1794 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are);
1783 convolve_gaussian(target, srcTexture, srcRect, sigmaX, radiusX, 1795 convolve_gaussian(target, srcTexture, srcRect, sigmaX, radiusX,
1784 Gr1DKernelEffect::kX_Direction); 1796 Gr1DKernelEffect::kX_Direction);
1785 srcTexture = dstTexture; 1797 srcTexture = dstTexture;
1786 SkTSwap(dstTexture, tempTexture); 1798 SkTSwap(dstTexture, tempTexture);
1787 } 1799 }
1788 1800
1789 if (sigmaY > 0.0f) { 1801 if (sigmaY > 0.0f) {
1790 if (scaleFactorY > 1 || sigmaX > 0.0f) { 1802 if (scaleFactorY > 1 || sigmaX > 0.0f) {
1791 // Clear out a radius below the srcRect to prevent the Y 1803 // Clear out a radius below the srcRect to prevent the Y
1792 // convolution from reading garbage. 1804 // convolution from reading garbage.
1793 clearRect = SkIRect::MakeXYWH(srcIRect.fLeft, srcIRect.fBottom, 1805 clearRect = SkIRect::MakeXYWH(srcIRect.fLeft, srcIRect.fBottom,
1794 srcIRect.width(), radiusY); 1806 srcIRect.width(), radiusY);
1795 this->clear(&clearRect, 0x0); 1807 this->clear(&clearRect, 0x0);
1796 } 1808 }
1797 1809
1798 this->setRenderTarget(dstTexture->asRenderTarget()); 1810 this->setRenderTarget(dstTexture->asRenderTarget());
1799 GrDrawTarget* target = this->prepareToDraw(NULL, BUFFERED_DRAW); 1811 AutoRestoreEffects are;
1812 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are);
1800 convolve_gaussian(target, srcTexture, srcRect, sigmaY, radiusY, 1813 convolve_gaussian(target, srcTexture, srcRect, sigmaY, radiusY,
1801 Gr1DKernelEffect::kY_Direction); 1814 Gr1DKernelEffect::kY_Direction);
1802 srcTexture = dstTexture; 1815 srcTexture = dstTexture;
1803 SkTSwap(dstTexture, tempTexture); 1816 SkTSwap(dstTexture, tempTexture);
1804 } 1817 }
1805 1818
1806 if (scaleFactorX > 1 || scaleFactorY > 1) { 1819 if (scaleFactorX > 1 || scaleFactorY > 1) {
1807 // Clear one pixel to the right and below, to accommodate bilinear 1820 // Clear one pixel to the right and below, to accommodate bilinear
1808 // upsampling. 1821 // upsampling.
1809 clearRect = SkIRect::MakeXYWH(srcIRect.fLeft, srcIRect.fBottom, 1822 clearRect = SkIRect::MakeXYWH(srcIRect.fLeft, srcIRect.fBottom,
(...skipping 25 matching lines...) Expand all
1835 return srcTexture; 1848 return srcTexture;
1836 } 1849 }
1837 } 1850 }
1838 1851
1839 /////////////////////////////////////////////////////////////////////////////// 1852 ///////////////////////////////////////////////////////////////////////////////
1840 #if GR_CACHE_STATS 1853 #if GR_CACHE_STATS
1841 void GrContext::printCacheStats() const { 1854 void GrContext::printCacheStats() const {
1842 fTextureCache->printStats(); 1855 fTextureCache->printStats();
1843 } 1856 }
1844 #endif 1857 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrClipMaskManager.cpp ('k') | src/gpu/GrDrawState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698