Chromium Code Reviews| 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 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 94 fTextureCache = NULL; | 94 fTextureCache = NULL; |
| 95 fFontCache = NULL; | 95 fFontCache = NULL; |
| 96 fDrawBuffer = NULL; | 96 fDrawBuffer = NULL; |
| 97 fDrawBufferVBAllocPool = NULL; | 97 fDrawBufferVBAllocPool = NULL; |
| 98 fDrawBufferIBAllocPool = NULL; | 98 fDrawBufferIBAllocPool = NULL; |
| 99 fFlushToReduceCacheSize = false; | 99 fFlushToReduceCacheSize = false; |
| 100 fAARectRenderer = NULL; | 100 fAARectRenderer = NULL; |
| 101 fOvalRenderer = NULL; | 101 fOvalRenderer = NULL; |
| 102 fViewMatrix.reset(); | 102 fViewMatrix.reset(); |
| 103 fMaxTextureSizeOverride = 1 << 20; | 103 fMaxTextureSizeOverride = 1 << 20; |
| 104 fGpuTracingEnabled = true; | |
|
bsalomon
2014/03/17 17:50:38
Let's start with false.
egdaniel
2014/03/17 19:49:12
That's the plan. Just set that way right now for e
| |
| 104 } | 105 } |
| 105 | 106 |
| 106 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { | 107 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { |
| 107 SkASSERT(NULL == fGpu); | 108 SkASSERT(NULL == fGpu); |
| 108 | 109 |
| 109 fGpu = GrGpu::Create(backend, backendContext, this); | 110 fGpu = GrGpu::Create(backend, backendContext, this); |
| 110 if (NULL == fGpu) { | 111 if (NULL == fGpu) { |
| 111 return false; | 112 return false; |
| 112 } | 113 } |
| 113 | 114 |
| (...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 763 void GrContext::drawRect(const GrPaint& paint, | 764 void GrContext::drawRect(const GrPaint& paint, |
| 764 const SkRect& rect, | 765 const SkRect& rect, |
| 765 const SkStrokeRec* stroke, | 766 const SkStrokeRec* stroke, |
| 766 const SkMatrix* matrix) { | 767 const SkMatrix* matrix) { |
| 767 SK_TRACE_EVENT0("GrContext::drawRect"); | 768 SK_TRACE_EVENT0("GrContext::drawRect"); |
| 768 | 769 |
| 769 AutoRestoreEffects are; | 770 AutoRestoreEffects are; |
| 770 AutoCheckFlush acf(this); | 771 AutoCheckFlush acf(this); |
| 771 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); | 772 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); |
| 772 | 773 |
| 774 GR_CREATE_GPU_TRACE_MARKER("Test_marker_DRAW_RECT", target); | |
| 775 | |
| 773 SkScalar width = stroke == NULL ? -1 : stroke->getWidth(); | 776 SkScalar width = stroke == NULL ? -1 : stroke->getWidth(); |
| 774 SkMatrix combinedMatrix = target->drawState()->getViewMatrix(); | 777 SkMatrix combinedMatrix = target->drawState()->getViewMatrix(); |
| 775 if (NULL != matrix) { | 778 if (NULL != matrix) { |
| 776 combinedMatrix.preConcat(*matrix); | 779 combinedMatrix.preConcat(*matrix); |
| 777 } | 780 } |
| 778 | 781 |
| 779 // Check if this is a full RT draw and can be replaced with a clear. We don' t bother checking | 782 // Check if this is a full RT draw and can be replaced with a clear. We don' t bother checking |
| 780 // cases where the RT is fully inside a stroke. | 783 // cases where the RT is fully inside a stroke. |
| 781 if (width < 0) { | 784 if (width < 0) { |
| 782 SkRect rtRect; | 785 SkRect rtRect; |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 941 const uint16_t indices[], | 944 const uint16_t indices[], |
| 942 int indexCount) { | 945 int indexCount) { |
| 943 SK_TRACE_EVENT0("GrContext::drawVertices"); | 946 SK_TRACE_EVENT0("GrContext::drawVertices"); |
| 944 | 947 |
| 945 AutoRestoreEffects are; | 948 AutoRestoreEffects are; |
| 946 AutoCheckFlush acf(this); | 949 AutoCheckFlush acf(this); |
| 947 GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scop e | 950 GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scop e |
| 948 | 951 |
| 949 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); | 952 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); |
| 950 | 953 |
| 954 GR_CREATE_GPU_TRACE_MARKER("Test_marker_DRAW_VERTICES", target); | |
| 955 | |
| 951 GrDrawState* drawState = target->drawState(); | 956 GrDrawState* drawState = target->drawState(); |
| 952 | 957 |
| 953 int colorOffset = -1, texOffset = -1; | 958 int colorOffset = -1, texOffset = -1; |
| 954 set_vertex_attributes(drawState, texCoords, colors, &colorOffset, &texOffset ); | 959 set_vertex_attributes(drawState, texCoords, colors, &colorOffset, &texOffset ); |
| 955 | 960 |
| 956 size_t vertexSize = drawState->getVertexSize(); | 961 size_t vertexSize = drawState->getVertexSize(); |
| 957 if (sizeof(GrPoint) != vertexSize) { | 962 if (sizeof(GrPoint) != vertexSize) { |
| 958 if (!geo.set(target, vertexCount, 0)) { | 963 if (!geo.set(target, vertexCount, 0)) { |
| 959 GrPrintf("Failed to get space for vertices!\n"); | 964 GrPrintf("Failed to get space for vertices!\n"); |
| 960 return; | 965 return; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 994 const SkRRect& rect, | 999 const SkRRect& rect, |
| 995 const SkStrokeRec& stroke) { | 1000 const SkStrokeRec& stroke) { |
| 996 if (rect.isEmpty()) { | 1001 if (rect.isEmpty()) { |
| 997 return; | 1002 return; |
| 998 } | 1003 } |
| 999 | 1004 |
| 1000 AutoRestoreEffects are; | 1005 AutoRestoreEffects are; |
| 1001 AutoCheckFlush acf(this); | 1006 AutoCheckFlush acf(this); |
| 1002 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); | 1007 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); |
| 1003 | 1008 |
| 1009 GR_CREATE_GPU_TRACE_MARKER("Test_marker_DRAW_ROUND_REC", target); | |
|
bsalomon
2014/03/17 17:50:38
.._RECT (T)
| |
| 1010 | |
| 1004 if (!fOvalRenderer->drawSimpleRRect(target, this, paint.isAntiAlias(), rect, stroke)) { | 1011 if (!fOvalRenderer->drawSimpleRRect(target, this, paint.isAntiAlias(), rect, stroke)) { |
| 1005 SkPath path; | 1012 SkPath path; |
| 1006 path.addRRect(rect); | 1013 path.addRRect(rect); |
| 1007 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); | 1014 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); |
| 1008 } | 1015 } |
| 1009 } | 1016 } |
| 1010 | 1017 |
| 1011 /////////////////////////////////////////////////////////////////////////////// | 1018 /////////////////////////////////////////////////////////////////////////////// |
| 1012 | 1019 |
| 1013 void GrContext::drawOval(const GrPaint& paint, | 1020 void GrContext::drawOval(const GrPaint& paint, |
| 1014 const SkRect& oval, | 1021 const SkRect& oval, |
| 1015 const SkStrokeRec& stroke) { | 1022 const SkStrokeRec& stroke) { |
| 1016 if (oval.isEmpty()) { | 1023 if (oval.isEmpty()) { |
| 1017 return; | 1024 return; |
| 1018 } | 1025 } |
| 1019 | 1026 |
| 1020 AutoRestoreEffects are; | 1027 AutoRestoreEffects are; |
| 1021 AutoCheckFlush acf(this); | 1028 AutoCheckFlush acf(this); |
| 1022 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); | 1029 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); |
| 1023 | 1030 |
| 1031 GR_CREATE_GPU_TRACE_MARKER("Test_marker_DRAW_OVAL", target); | |
| 1032 | |
| 1024 if (!fOvalRenderer->drawOval(target, this, paint.isAntiAlias(), oval, stroke )) { | 1033 if (!fOvalRenderer->drawOval(target, this, paint.isAntiAlias(), oval, stroke )) { |
| 1025 SkPath path; | 1034 SkPath path; |
| 1026 path.addOval(oval); | 1035 path.addOval(oval); |
| 1027 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); | 1036 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); |
| 1028 } | 1037 } |
| 1029 } | 1038 } |
| 1030 | 1039 |
| 1031 // Can 'path' be drawn as a pair of filled nested rectangles? | 1040 // Can 'path' be drawn as a pair of filled nested rectangles? |
| 1032 static bool is_nested_rects(GrDrawTarget* target, | 1041 static bool is_nested_rects(GrDrawTarget* target, |
| 1033 const SkPath& path, | 1042 const SkPath& path, |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1090 this->drawPaint(paint); | 1099 this->drawPaint(paint); |
| 1091 } | 1100 } |
| 1092 return; | 1101 return; |
| 1093 } | 1102 } |
| 1094 | 1103 |
| 1095 // 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. |
| 1096 // 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 |
| 1097 // cache. This presents a potential hazard for buffered drawing. However, | 1106 // cache. This presents a potential hazard for buffered drawing. However, |
| 1098 // 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 |
| 1099 // OK. | 1108 // OK. |
| 1109 | |
| 1100 AutoRestoreEffects are; | 1110 AutoRestoreEffects are; |
| 1101 AutoCheckFlush acf(this); | 1111 AutoCheckFlush acf(this); |
| 1102 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); | 1112 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); |
| 1103 GrDrawState* drawState = target->drawState(); | 1113 GrDrawState* drawState = target->drawState(); |
| 1104 | 1114 |
| 1115 GR_CREATE_GPU_TRACE_MARKER("Test_marker_DRAW_PATH", target); | |
| 1116 | |
| 1105 bool useCoverageAA = paint.isAntiAlias() && !drawState->getRenderTarget()->i sMultisampled(); | 1117 bool useCoverageAA = paint.isAntiAlias() && !drawState->getRenderTarget()->i sMultisampled(); |
| 1106 | 1118 |
| 1107 if (useCoverageAA && stroke.getWidth() < 0 && !path.isConvex()) { | 1119 if (useCoverageAA && stroke.getWidth() < 0 && !path.isConvex()) { |
| 1108 // Concave AA paths are expensive - try to avoid them for special cases | 1120 // Concave AA paths are expensive - try to avoid them for special cases |
| 1109 bool useVertexCoverage; | 1121 bool useVertexCoverage; |
| 1110 SkRect rects[2]; | 1122 SkRect rects[2]; |
| 1111 | 1123 |
| 1112 if (is_nested_rects(target, path, stroke, rects, &useVertexCoverage)) { | 1124 if (is_nested_rects(target, path, stroke, rects, &useVertexCoverage)) { |
| 1113 SkMatrix origViewMatrix = drawState->getViewMatrix(); | 1125 SkMatrix origViewMatrix = drawState->getViewMatrix(); |
| 1114 GrDrawState::AutoViewMatrixRestore avmr; | 1126 GrDrawState::AutoViewMatrixRestore avmr; |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1130 if (!isOval || path.isInverseFillType() | 1142 if (!isOval || path.isInverseFillType() |
| 1131 || !fOvalRenderer->drawOval(target, this, paint.isAntiAlias(), ovalRect, stroke)) { | 1143 || !fOvalRenderer->drawOval(target, this, paint.isAntiAlias(), ovalRect, stroke)) { |
| 1132 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); | 1144 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); |
| 1133 } | 1145 } |
| 1134 } | 1146 } |
| 1135 | 1147 |
| 1136 void GrContext::internalDrawPath(GrDrawTarget* target, bool useAA, const SkPath& path, | 1148 void GrContext::internalDrawPath(GrDrawTarget* target, bool useAA, const SkPath& path, |
| 1137 const SkStrokeRec& origStroke) { | 1149 const SkStrokeRec& origStroke) { |
| 1138 SkASSERT(!path.isEmpty()); | 1150 SkASSERT(!path.isEmpty()); |
| 1139 | 1151 |
| 1152 GR_CREATE_GPU_TRACE_MARKER("Test_marker_INTERNAL_DRAW_PATH", target); | |
| 1153 | |
| 1154 | |
| 1140 // An Assumption here is that path renderer would use some form of tweaking | 1155 // An Assumption here is that path renderer would use some form of tweaking |
| 1141 // the src color (either the input alpha or in the frag shader) to implement | 1156 // the src color (either the input alpha or in the frag shader) to implement |
| 1142 // aa. If we have some future driver-mojo path AA that can do the right | 1157 // aa. If we have some future driver-mojo path AA that can do the right |
| 1143 // thing WRT to the blend then we'll need some query on the PR. | 1158 // thing WRT to the blend then we'll need some query on the PR. |
| 1144 bool useCoverageAA = useAA && | 1159 bool useCoverageAA = useAA && |
| 1145 !target->getDrawState().getRenderTarget()->isMultisampled() && | 1160 !target->getDrawState().getRenderTarget()->isMultisampled() && |
| 1146 !target->shouldDisableCoverageAAForBlend(); | 1161 !target->shouldDisableCoverageAAForBlend(); |
| 1147 | 1162 |
| 1148 | 1163 |
| 1149 GrPathRendererChain::DrawType type = | 1164 GrPathRendererChain::DrawType type = |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1224 } | 1239 } |
| 1225 | 1240 |
| 1226 bool GrContext::readTexturePixels(GrTexture* texture, | 1241 bool GrContext::readTexturePixels(GrTexture* texture, |
| 1227 int left, int top, int width, int height, | 1242 int left, int top, int width, int height, |
| 1228 GrPixelConfig config, void* buffer, size_t row Bytes, | 1243 GrPixelConfig config, void* buffer, size_t row Bytes, |
| 1229 uint32_t flags) { | 1244 uint32_t flags) { |
| 1230 SK_TRACE_EVENT0("GrContext::readTexturePixels"); | 1245 SK_TRACE_EVENT0("GrContext::readTexturePixels"); |
| 1231 ASSERT_OWNED_RESOURCE(texture); | 1246 ASSERT_OWNED_RESOURCE(texture); |
| 1232 | 1247 |
| 1233 GrRenderTarget* target = texture->asRenderTarget(); | 1248 GrRenderTarget* target = texture->asRenderTarget(); |
| 1249 | |
| 1234 if (NULL != target) { | 1250 if (NULL != target) { |
| 1235 return this->readRenderTargetPixels(target, | 1251 return this->readRenderTargetPixels(target, |
| 1236 left, top, width, height, | 1252 left, top, width, height, |
| 1237 config, buffer, rowBytes, | 1253 config, buffer, rowBytes, |
| 1238 flags); | 1254 flags); |
| 1239 } else { | 1255 } else { |
| 1240 // TODO: make this more efficient for cases where we're reading the enti re | 1256 // TODO: make this more efficient for cases where we're reading the enti re |
| 1241 // texture, i.e., use GetTexImage() instead | 1257 // texture, i.e., use GetTexImage() instead |
| 1242 | 1258 |
| 1243 // create scratch rendertarget and read from that | 1259 // create scratch rendertarget and read from that |
| (...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1806 } | 1822 } |
| 1807 return path; | 1823 return path; |
| 1808 } | 1824 } |
| 1809 | 1825 |
| 1810 /////////////////////////////////////////////////////////////////////////////// | 1826 /////////////////////////////////////////////////////////////////////////////// |
| 1811 #if GR_CACHE_STATS | 1827 #if GR_CACHE_STATS |
| 1812 void GrContext::printCacheStats() const { | 1828 void GrContext::printCacheStats() const { |
| 1813 fTextureCache->printStats(); | 1829 fTextureCache->printStats(); |
| 1814 } | 1830 } |
| 1815 #endif | 1831 #endif |
| OLD | NEW |