| OLD | NEW |
| 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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 static const int DRAW_BUFFER_VBPOOL_PREALLOC_BUFFERS = 4; | 61 static const int DRAW_BUFFER_VBPOOL_PREALLOC_BUFFERS = 4; |
| 62 | 62 |
| 63 static const size_t DRAW_BUFFER_IBPOOL_BUFFER_SIZE = 1 << 11; | 63 static const size_t DRAW_BUFFER_IBPOOL_BUFFER_SIZE = 1 << 11; |
| 64 static const int DRAW_BUFFER_IBPOOL_PREALLOC_BUFFERS = 4; | 64 static const int DRAW_BUFFER_IBPOOL_PREALLOC_BUFFERS = 4; |
| 65 | 65 |
| 66 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == this) | 66 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == this) |
| 67 | 67 |
| 68 // Glorified typedef to avoid including GrDrawState.h in GrContext.h | 68 // Glorified typedef to avoid including GrDrawState.h in GrContext.h |
| 69 class GrContext::AutoRestoreEffects : public GrDrawState::AutoRestoreEffects {}; | 69 class GrContext::AutoRestoreEffects : public GrDrawState::AutoRestoreEffects {}; |
| 70 | 70 |
| 71 class GrContext::AutoCheckFlush { |
| 72 public: |
| 73 AutoCheckFlush(GrContext* context) : fContext(context) { SkASSERT(NULL != co
ntext); } |
| 74 |
| 75 ~AutoCheckFlush() { |
| 76 if (fContext->fFlushToReduceCacheSize) { |
| 77 fContext->flush(); |
| 78 } |
| 79 } |
| 80 |
| 81 private: |
| 82 GrContext* fContext; |
| 83 }; |
| 84 |
| 71 GrContext* GrContext::Create(GrBackend backend, GrBackendContext backendContext)
{ | 85 GrContext* GrContext::Create(GrBackend backend, GrBackendContext backendContext)
{ |
| 72 GrContext* context = SkNEW(GrContext); | 86 GrContext* context = SkNEW(GrContext); |
| 73 if (context->init(backend, backendContext)) { | 87 if (context->init(backend, backendContext)) { |
| 74 return context; | 88 return context; |
| 75 } else { | 89 } else { |
| 76 context->unref(); | 90 context->unref(); |
| 77 return NULL; | 91 return NULL; |
| 78 } | 92 } |
| 79 } | 93 } |
| 80 | 94 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 94 fDrawState = NULL; | 108 fDrawState = NULL; |
| 95 fGpu = NULL; | 109 fGpu = NULL; |
| 96 fClip = NULL; | 110 fClip = NULL; |
| 97 fPathRendererChain = NULL; | 111 fPathRendererChain = NULL; |
| 98 fSoftwarePathRenderer = NULL; | 112 fSoftwarePathRenderer = NULL; |
| 99 fTextureCache = NULL; | 113 fTextureCache = NULL; |
| 100 fFontCache = NULL; | 114 fFontCache = NULL; |
| 101 fDrawBuffer = NULL; | 115 fDrawBuffer = NULL; |
| 102 fDrawBufferVBAllocPool = NULL; | 116 fDrawBufferVBAllocPool = NULL; |
| 103 fDrawBufferIBAllocPool = NULL; | 117 fDrawBufferIBAllocPool = NULL; |
| 118 fFlushToReduceCacheSize = false; |
| 104 fAARectRenderer = NULL; | 119 fAARectRenderer = NULL; |
| 105 fOvalRenderer = NULL; | 120 fOvalRenderer = NULL; |
| 106 fViewMatrix.reset(); | 121 fViewMatrix.reset(); |
| 107 fMaxTextureSizeOverride = 1 << 20; | 122 fMaxTextureSizeOverride = 1 << 20; |
| 108 } | 123 } |
| 109 | 124 |
| 110 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { | 125 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { |
| 111 SkASSERT(NULL == fGpu); | 126 SkASSERT(NULL == fGpu); |
| 112 | 127 |
| 113 fGpu = GrGpu::Create(backend, backendContext, this); | 128 fGpu = GrGpu::Create(backend, backendContext, this); |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 fTextureCache->purgeAsNeeded(); | 541 fTextureCache->purgeAsNeeded(); |
| 527 } | 542 } |
| 528 } | 543 } |
| 529 | 544 |
| 530 bool GrContext::OverbudgetCB(void* data) { | 545 bool GrContext::OverbudgetCB(void* data) { |
| 531 SkASSERT(NULL != data); | 546 SkASSERT(NULL != data); |
| 532 | 547 |
| 533 GrContext* context = reinterpret_cast<GrContext*>(data); | 548 GrContext* context = reinterpret_cast<GrContext*>(data); |
| 534 | 549 |
| 535 // Flush the InOrderDrawBuffer to possibly free up some textures | 550 // Flush the InOrderDrawBuffer to possibly free up some textures |
| 536 context->flush(); | 551 context->fFlushToReduceCacheSize = true; |
| 537 | 552 |
| 538 // TODO: actually track flush's behavior rather than always just | |
| 539 // returning true. | |
| 540 return true; | 553 return true; |
| 541 } | 554 } |
| 542 | 555 |
| 543 | 556 |
| 544 GrTexture* GrContext::createUncachedTexture(const GrTextureDesc& descIn, | 557 GrTexture* GrContext::createUncachedTexture(const GrTextureDesc& descIn, |
| 545 void* srcData, | 558 void* srcData, |
| 546 size_t rowBytes) { | 559 size_t rowBytes) { |
| 547 GrTextureDesc descCopy = descIn; | 560 GrTextureDesc descCopy = descIn; |
| 548 return fGpu->createTexture(descCopy, srcData, rowBytes); | 561 return fGpu->createTexture(descCopy, srcData, rowBytes); |
| 549 } | 562 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 return true; | 612 return true; |
| 600 } | 613 } |
| 601 | 614 |
| 602 | 615 |
| 603 //////////////////////////////////////////////////////////////////////////////// | 616 //////////////////////////////////////////////////////////////////////////////// |
| 604 | 617 |
| 605 void GrContext::clear(const SkIRect* rect, | 618 void GrContext::clear(const SkIRect* rect, |
| 606 const GrColor color, | 619 const GrColor color, |
| 607 GrRenderTarget* target) { | 620 GrRenderTarget* target) { |
| 608 AutoRestoreEffects are; | 621 AutoRestoreEffects are; |
| 609 this->prepareToDraw(NULL, BUFFERED_DRAW, &are)->clear(rect, color, target); | 622 AutoCheckFlush acf(this); |
| 623 this->prepareToDraw(NULL, BUFFERED_DRAW, &are, &acf)->clear(rect, color, tar
get); |
| 610 } | 624 } |
| 611 | 625 |
| 612 void GrContext::drawPaint(const GrPaint& origPaint) { | 626 void GrContext::drawPaint(const GrPaint& origPaint) { |
| 613 // set rect to be big enough to fill the space, but not super-huge, so we | 627 // set rect to be big enough to fill the space, but not super-huge, so we |
| 614 // don't overflow fixed-point implementations | 628 // don't overflow fixed-point implementations |
| 615 SkRect r; | 629 SkRect r; |
| 616 r.setLTRB(0, 0, | 630 r.setLTRB(0, 0, |
| 617 SkIntToScalar(getRenderTarget()->width()), | 631 SkIntToScalar(getRenderTarget()->width()), |
| 618 SkIntToScalar(getRenderTarget()->height())); | 632 SkIntToScalar(getRenderTarget()->height())); |
| 619 SkMatrix inverse; | 633 SkMatrix inverse; |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 748 point.fY >= rect.fTop && point.fY <= rect.fBottom; | 762 point.fY >= rect.fTop && point.fY <= rect.fBottom; |
| 749 } | 763 } |
| 750 | 764 |
| 751 void GrContext::drawRect(const GrPaint& paint, | 765 void GrContext::drawRect(const GrPaint& paint, |
| 752 const SkRect& rect, | 766 const SkRect& rect, |
| 753 SkScalar width, | 767 SkScalar width, |
| 754 const SkMatrix* matrix) { | 768 const SkMatrix* matrix) { |
| 755 SK_TRACE_EVENT0("GrContext::drawRect"); | 769 SK_TRACE_EVENT0("GrContext::drawRect"); |
| 756 | 770 |
| 757 AutoRestoreEffects are; | 771 AutoRestoreEffects are; |
| 758 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); | 772 AutoCheckFlush acf(this); |
| 773 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); |
| 759 | 774 |
| 760 SkMatrix combinedMatrix = target->drawState()->getViewMatrix(); | 775 SkMatrix combinedMatrix = target->drawState()->getViewMatrix(); |
| 761 if (NULL != matrix) { | 776 if (NULL != matrix) { |
| 762 combinedMatrix.preConcat(*matrix); | 777 combinedMatrix.preConcat(*matrix); |
| 763 } | 778 } |
| 764 | 779 |
| 765 // Check if this is a full RT draw and can be replaced with a clear. We don'
t bother checking | 780 // Check if this is a full RT draw and can be replaced with a clear. We don'
t bother checking |
| 766 // cases where the RT is fully inside a stroke. | 781 // cases where the RT is fully inside a stroke. |
| 767 if (width < 0) { | 782 if (width < 0) { |
| 768 SkRect rtRect; | 783 SkRect rtRect; |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 867 } | 882 } |
| 868 } | 883 } |
| 869 | 884 |
| 870 void GrContext::drawRectToRect(const GrPaint& paint, | 885 void GrContext::drawRectToRect(const GrPaint& paint, |
| 871 const SkRect& dstRect, | 886 const SkRect& dstRect, |
| 872 const SkRect& localRect, | 887 const SkRect& localRect, |
| 873 const SkMatrix* dstMatrix, | 888 const SkMatrix* dstMatrix, |
| 874 const SkMatrix* localMatrix) { | 889 const SkMatrix* localMatrix) { |
| 875 SK_TRACE_EVENT0("GrContext::drawRectToRect"); | 890 SK_TRACE_EVENT0("GrContext::drawRectToRect"); |
| 876 AutoRestoreEffects are; | 891 AutoRestoreEffects are; |
| 877 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); | 892 AutoCheckFlush acf(this); |
| 893 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); |
| 878 | 894 |
| 879 target->drawRect(dstRect, dstMatrix, &localRect, localMatrix); | 895 target->drawRect(dstRect, dstMatrix, &localRect, localMatrix); |
| 880 } | 896 } |
| 881 | 897 |
| 882 namespace { | 898 namespace { |
| 883 | 899 |
| 884 extern const GrVertexAttrib gPosUVColorAttribs[] = { | 900 extern const GrVertexAttrib gPosUVColorAttribs[] = { |
| 885 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding }, | 901 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding }, |
| 886 {kVec2f_GrVertexAttribType, sizeof(GrPoint), kLocalCoord_GrVertexAttribBind
ing }, | 902 {kVec2f_GrVertexAttribType, sizeof(GrPoint), kLocalCoord_GrVertexAttribBind
ing }, |
| 887 {kVec4ub_GrVertexAttribType, 2*sizeof(GrPoint), kColor_GrVertexAttribBinding
} | 903 {kVec4ub_GrVertexAttribType, 2*sizeof(GrPoint), kColor_GrVertexAttribBinding
} |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 923 const GrPoint positions[], | 939 const GrPoint positions[], |
| 924 const GrPoint texCoords[], | 940 const GrPoint texCoords[], |
| 925 const GrColor colors[], | 941 const GrColor colors[], |
| 926 const uint16_t indices[], | 942 const uint16_t indices[], |
| 927 int indexCount) { | 943 int indexCount) { |
| 928 SK_TRACE_EVENT0("GrContext::drawVertices"); | 944 SK_TRACE_EVENT0("GrContext::drawVertices"); |
| 929 | 945 |
| 930 GrDrawTarget::AutoReleaseGeometry geo; | 946 GrDrawTarget::AutoReleaseGeometry geo; |
| 931 | 947 |
| 932 AutoRestoreEffects are; | 948 AutoRestoreEffects are; |
| 933 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); | 949 AutoCheckFlush acf(this); |
| 950 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); |
| 934 | 951 |
| 935 GrDrawState* drawState = target->drawState(); | 952 GrDrawState* drawState = target->drawState(); |
| 936 | 953 |
| 937 int colorOffset = -1, texOffset = -1; | 954 int colorOffset = -1, texOffset = -1; |
| 938 set_vertex_attributes(drawState, texCoords, colors, &colorOffset, &texOffset
); | 955 set_vertex_attributes(drawState, texCoords, colors, &colorOffset, &texOffset
); |
| 939 | 956 |
| 940 size_t vertexSize = drawState->getVertexSize(); | 957 size_t vertexSize = drawState->getVertexSize(); |
| 941 if (sizeof(GrPoint) != vertexSize) { | 958 if (sizeof(GrPoint) != vertexSize) { |
| 942 if (!geo.set(target, vertexCount, 0)) { | 959 if (!geo.set(target, vertexCount, 0)) { |
| 943 GrPrintf("Failed to get space for vertices!\n"); | 960 GrPrintf("Failed to get space for vertices!\n"); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 975 /////////////////////////////////////////////////////////////////////////////// | 992 /////////////////////////////////////////////////////////////////////////////// |
| 976 | 993 |
| 977 void GrContext::drawRRect(const GrPaint& paint, | 994 void GrContext::drawRRect(const GrPaint& paint, |
| 978 const SkRRect& rect, | 995 const SkRRect& rect, |
| 979 const SkStrokeRec& stroke) { | 996 const SkStrokeRec& stroke) { |
| 980 if (rect.isEmpty()) { | 997 if (rect.isEmpty()) { |
| 981 return; | 998 return; |
| 982 } | 999 } |
| 983 | 1000 |
| 984 AutoRestoreEffects are; | 1001 AutoRestoreEffects are; |
| 985 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); | 1002 AutoCheckFlush acf(this); |
| 1003 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); |
| 986 | 1004 |
| 987 bool useAA = paint.isAntiAlias() && | 1005 bool useAA = paint.isAntiAlias() && |
| 988 !target->getDrawState().getRenderTarget()->isMultisampled() && | 1006 !target->getDrawState().getRenderTarget()->isMultisampled() && |
| 989 !disable_coverage_aa_for_blend(target); | 1007 !disable_coverage_aa_for_blend(target); |
| 990 | 1008 |
| 991 if (!fOvalRenderer->drawSimpleRRect(target, this, useAA, rect, stroke)) { | 1009 if (!fOvalRenderer->drawSimpleRRect(target, this, useAA, rect, stroke)) { |
| 992 SkPath path; | 1010 SkPath path; |
| 993 path.addRRect(rect); | 1011 path.addRRect(rect); |
| 994 this->internalDrawPath(target, useAA, path, stroke); | 1012 this->internalDrawPath(target, useAA, path, stroke); |
| 995 } | 1013 } |
| 996 } | 1014 } |
| 997 | 1015 |
| 998 /////////////////////////////////////////////////////////////////////////////// | 1016 /////////////////////////////////////////////////////////////////////////////// |
| 999 | 1017 |
| 1000 void GrContext::drawOval(const GrPaint& paint, | 1018 void GrContext::drawOval(const GrPaint& paint, |
| 1001 const SkRect& oval, | 1019 const SkRect& oval, |
| 1002 const SkStrokeRec& stroke) { | 1020 const SkStrokeRec& stroke) { |
| 1003 if (oval.isEmpty()) { | 1021 if (oval.isEmpty()) { |
| 1004 return; | 1022 return; |
| 1005 } | 1023 } |
| 1006 | 1024 |
| 1007 AutoRestoreEffects are; | 1025 AutoRestoreEffects are; |
| 1008 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); | 1026 AutoCheckFlush acf(this); |
| 1027 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); |
| 1009 | 1028 |
| 1010 bool useAA = paint.isAntiAlias() && | 1029 bool useAA = paint.isAntiAlias() && |
| 1011 !target->getDrawState().getRenderTarget()->isMultisampled() && | 1030 !target->getDrawState().getRenderTarget()->isMultisampled() && |
| 1012 !disable_coverage_aa_for_blend(target); | 1031 !disable_coverage_aa_for_blend(target); |
| 1013 | 1032 |
| 1014 if (!fOvalRenderer->drawOval(target, this, useAA, oval, stroke)) { | 1033 if (!fOvalRenderer->drawOval(target, this, useAA, oval, stroke)) { |
| 1015 SkPath path; | 1034 SkPath path; |
| 1016 path.addOval(oval); | 1035 path.addOval(oval); |
| 1017 this->internalDrawPath(target, useAA, path, stroke); | 1036 this->internalDrawPath(target, useAA, path, stroke); |
| 1018 } | 1037 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1081 } | 1100 } |
| 1082 return; | 1101 return; |
| 1083 } | 1102 } |
| 1084 | 1103 |
| 1085 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. | 1104 // Note that internalDrawPath may sw-rasterize the path into a scratch textu
re. |
| 1086 // Scratch textures can be recycled after they are returned to the texture | 1105 // Scratch textures can be recycled after they are returned to the texture |
| 1087 // cache. This presents a potential hazard for buffered drawing. However, | 1106 // cache. This presents a potential hazard for buffered drawing. However, |
| 1088 // the writePixels that uploads to the scratch will perform a flush so we're | 1107 // the writePixels that uploads to the scratch will perform a flush so we're |
| 1089 // OK. | 1108 // OK. |
| 1090 AutoRestoreEffects are; | 1109 AutoRestoreEffects are; |
| 1091 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are); | 1110 AutoCheckFlush acf(this); |
| 1111 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf
); |
| 1092 | 1112 |
| 1093 bool useAA = paint.isAntiAlias() && !target->getDrawState().getRenderTarget(
)->isMultisampled(); | 1113 bool useAA = paint.isAntiAlias() && !target->getDrawState().getRenderTarget(
)->isMultisampled(); |
| 1094 if (useAA && stroke.getWidth() < 0 && !path.isConvex()) { | 1114 if (useAA && stroke.getWidth() < 0 && !path.isConvex()) { |
| 1095 // Concave AA paths are expensive - try to avoid them for special cases | 1115 // Concave AA paths are expensive - try to avoid them for special cases |
| 1096 bool useVertexCoverage; | 1116 bool useVertexCoverage; |
| 1097 SkRect rects[2]; | 1117 SkRect rects[2]; |
| 1098 | 1118 |
| 1099 if (is_nested_rects(target, path, stroke, rects, &useVertexCoverage)) { | 1119 if (is_nested_rects(target, path, stroke, rects, &useVertexCoverage)) { |
| 1100 SkMatrix origViewMatrix = target->getDrawState().getViewMatrix(); | 1120 SkMatrix origViewMatrix = target->getDrawState().getViewMatrix(); |
| 1101 GrDrawState::AutoViewMatrixRestore avmr; | 1121 GrDrawState::AutoViewMatrixRestore avmr; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1176 void GrContext::flush(int flagsBitfield) { | 1196 void GrContext::flush(int flagsBitfield) { |
| 1177 if (NULL == fDrawBuffer) { | 1197 if (NULL == fDrawBuffer) { |
| 1178 return; | 1198 return; |
| 1179 } | 1199 } |
| 1180 | 1200 |
| 1181 if (kDiscard_FlushBit & flagsBitfield) { | 1201 if (kDiscard_FlushBit & flagsBitfield) { |
| 1182 fDrawBuffer->reset(); | 1202 fDrawBuffer->reset(); |
| 1183 } else { | 1203 } else { |
| 1184 fDrawBuffer->flush(); | 1204 fDrawBuffer->flush(); |
| 1185 } | 1205 } |
| 1206 fFlushToReduceCacheSize = false; |
| 1186 } | 1207 } |
| 1187 | 1208 |
| 1188 bool GrContext::writeTexturePixels(GrTexture* texture, | 1209 bool GrContext::writeTexturePixels(GrTexture* texture, |
| 1189 int left, int top, int width, int height, | 1210 int left, int top, int width, int height, |
| 1190 GrPixelConfig config, const void* buffer, siz
e_t rowBytes, | 1211 GrPixelConfig config, const void* buffer, siz
e_t rowBytes, |
| 1191 uint32_t flags) { | 1212 uint32_t flags) { |
| 1192 SK_TRACE_EVENT0("GrContext::writeTexturePixels"); | 1213 SK_TRACE_EVENT0("GrContext::writeTexturePixels"); |
| 1193 ASSERT_OWNED_RESOURCE(texture); | 1214 ASSERT_OWNED_RESOURCE(texture); |
| 1194 | 1215 |
| 1195 if ((kUnpremul_PixelOpsFlag & flags) || !fGpu->canWriteTexturePixels(texture
, config)) { | 1216 if ((kUnpremul_PixelOpsFlag & flags) || !fGpu->canWriteTexturePixels(texture
, config)) { |
| (...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1583 | 1604 |
| 1584 drawState->setRenderTarget(target); | 1605 drawState->setRenderTarget(target); |
| 1585 | 1606 |
| 1586 fGpu->drawSimpleRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(heig
ht)), NULL); | 1607 fGpu->drawSimpleRect(SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(heig
ht)), NULL); |
| 1587 return true; | 1608 return true; |
| 1588 } | 1609 } |
| 1589 //////////////////////////////////////////////////////////////////////////////// | 1610 //////////////////////////////////////////////////////////////////////////////// |
| 1590 | 1611 |
| 1591 GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint, | 1612 GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint, |
| 1592 BufferedDraw buffered, | 1613 BufferedDraw buffered, |
| 1593 AutoRestoreEffects* are) { | 1614 AutoRestoreEffects* are, |
| 1615 AutoCheckFlush* acf) { |
| 1594 // All users of this draw state should be freeing up all effects when they'r
e done. | 1616 // All users of this draw state should be freeing up all effects when they'r
e done. |
| 1595 // Otherwise effects that own resources may keep those resources alive indef
initely. | 1617 // Otherwise effects that own resources may keep those resources alive indef
initely. |
| 1596 SkASSERT(0 == fDrawState->numColorStages() && 0 == fDrawState->numCoverageSt
ages()); | 1618 SkASSERT(0 == fDrawState->numColorStages() && 0 == fDrawState->numCoverageSt
ages()); |
| 1597 | 1619 |
| 1598 if (kNo_BufferedDraw == buffered && kYes_BufferedDraw == fLastDrawWasBuffere
d) { | 1620 if (kNo_BufferedDraw == buffered && kYes_BufferedDraw == fLastDrawWasBuffere
d) { |
| 1599 fDrawBuffer->flush(); | 1621 fDrawBuffer->flush(); |
| 1600 fLastDrawWasBuffered = kNo_BufferedDraw; | 1622 fLastDrawWasBuffered = kNo_BufferedDraw; |
| 1601 } | 1623 } |
| 1602 ASSERT_OWNED_RESOURCE(fRenderTarget.get()); | 1624 ASSERT_OWNED_RESOURCE(fRenderTarget.get()); |
| 1603 if (NULL != paint) { | 1625 if (NULL != paint) { |
| 1604 SkASSERT(NULL != are); | 1626 SkASSERT(NULL != are); |
| 1627 SkASSERT(NULL != acf); |
| 1605 are->set(fDrawState); | 1628 are->set(fDrawState); |
| 1606 fDrawState->setFromPaint(*paint, fViewMatrix, fRenderTarget.get()); | 1629 fDrawState->setFromPaint(*paint, fViewMatrix, fRenderTarget.get()); |
| 1607 #if GR_DEBUG_PARTIAL_COVERAGE_CHECK | 1630 #if GR_DEBUG_PARTIAL_COVERAGE_CHECK |
| 1608 if ((paint->hasMask() || 0xff != paint->fCoverage) && | 1631 if ((paint->hasMask() || 0xff != paint->fCoverage) && |
| 1609 !fGpu->canApplyCoverage()) { | 1632 !fGpu->canApplyCoverage()) { |
| 1610 GrPrintf("Partial pixel coverage will be incorrectly blended.\n"); | 1633 GrPrintf("Partial pixel coverage will be incorrectly blended.\n"); |
| 1611 } | 1634 } |
| 1612 #endif | 1635 #endif |
| 1613 } else { | 1636 } else { |
| 1614 fDrawState->reset(fViewMatrix); | 1637 fDrawState->reset(fViewMatrix); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1694 DRAW_BUFFER_IBPOOL_PREALLOC_BUFFERS)); | 1717 DRAW_BUFFER_IBPOOL_PREALLOC_BUFFERS)); |
| 1695 | 1718 |
| 1696 fDrawBuffer = SkNEW_ARGS(GrInOrderDrawBuffer, (fGpu, | 1719 fDrawBuffer = SkNEW_ARGS(GrInOrderDrawBuffer, (fGpu, |
| 1697 fDrawBufferVBAllocPool, | 1720 fDrawBufferVBAllocPool, |
| 1698 fDrawBufferIBAllocPool)); | 1721 fDrawBufferIBAllocPool)); |
| 1699 | 1722 |
| 1700 fDrawBuffer->setDrawState(fDrawState); | 1723 fDrawBuffer->setDrawState(fDrawState); |
| 1701 } | 1724 } |
| 1702 | 1725 |
| 1703 GrDrawTarget* GrContext::getTextTarget() { | 1726 GrDrawTarget* GrContext::getTextTarget() { |
| 1704 return this->prepareToDraw(NULL, BUFFERED_DRAW, NULL); | 1727 return this->prepareToDraw(NULL, BUFFERED_DRAW, NULL, NULL); |
| 1705 } | 1728 } |
| 1706 | 1729 |
| 1707 const GrIndexBuffer* GrContext::getQuadIndexBuffer() const { | 1730 const GrIndexBuffer* GrContext::getQuadIndexBuffer() const { |
| 1708 return fGpu->getQuadIndexBuffer(); | 1731 return fGpu->getQuadIndexBuffer(); |
| 1709 } | 1732 } |
| 1710 | 1733 |
| 1711 namespace { | 1734 namespace { |
| 1712 void test_pm_conversions(GrContext* ctx, int* pmToUPMValue, int* upmToPMValue) { | 1735 void test_pm_conversions(GrContext* ctx, int* pmToUPMValue, int* upmToPMValue) { |
| 1713 GrConfigConversionEffect::PMConversion pmToUPM; | 1736 GrConfigConversionEffect::PMConversion pmToUPM; |
| 1714 GrConfigConversionEffect::PMConversion upmToPM; | 1737 GrConfigConversionEffect::PMConversion upmToPM; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1749 return NULL; | 1772 return NULL; |
| 1750 } | 1773 } |
| 1751 } | 1774 } |
| 1752 | 1775 |
| 1753 /////////////////////////////////////////////////////////////////////////////// | 1776 /////////////////////////////////////////////////////////////////////////////// |
| 1754 #if GR_CACHE_STATS | 1777 #if GR_CACHE_STATS |
| 1755 void GrContext::printCacheStats() const { | 1778 void GrContext::printCacheStats() const { |
| 1756 fTextureCache->printStats(); | 1779 fTextureCache->printStats(); |
| 1757 } | 1780 } |
| 1758 #endif | 1781 #endif |
| OLD | NEW |