OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 #include "GrAARectRenderer.h" | 8 #include "GrAARectRenderer.h" |
9 #include "GrBatch.h" | 9 #include "GrBatch.h" |
10 #include "GrBatchTarget.h" | 10 #include "GrBatchTarget.h" |
| 11 #include "GrBatchTest.h" |
11 #include "GrBufferAllocPool.h" | 12 #include "GrBufferAllocPool.h" |
| 13 #include "GrContext.h" |
12 #include "GrDefaultGeoProcFactory.h" | 14 #include "GrDefaultGeoProcFactory.h" |
13 #include "GrGeometryProcessor.h" | 15 #include "GrGeometryProcessor.h" |
14 #include "GrGpu.h" | 16 #include "GrGpu.h" |
15 #include "GrInvariantOutput.h" | 17 #include "GrInvariantOutput.h" |
16 #include "GrVertexBuffer.h" | 18 #include "GrVertexBuffer.h" |
| 19 #include "GrTestUtils.h" |
17 #include "SkColorPriv.h" | 20 #include "SkColorPriv.h" |
18 #include "gl/GrGLProcessor.h" | 21 #include "gl/GrGLProcessor.h" |
19 #include "gl/GrGLGeometryProcessor.h" | 22 #include "gl/GrGLGeometryProcessor.h" |
20 #include "gl/builders/GrGLProgramBuilder.h" | 23 #include "gl/builders/GrGLProgramBuilder.h" |
21 | 24 |
22 /////////////////////////////////////////////////////////////////////////////// | 25 /////////////////////////////////////////////////////////////////////////////// |
23 | 26 |
24 static void set_inset_fan(SkPoint* pts, size_t stride, | 27 static void set_inset_fan(SkPoint* pts, size_t stride, |
25 const SkRect& r, SkScalar dx, SkScalar dy) { | 28 const SkRect& r, SkScalar dx, SkScalar dy) { |
26 pts->setRectFan(r.fLeft + dx, r.fTop + dy, | 29 pts->setRectFan(r.fLeft + dx, r.fTop + dy, |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 | 419 |
417 static const int kIndicesPerBevelStrokeRect = SK_ARRAY_COUNT(gBevelStrokeAARectI
dx); | 420 static const int kIndicesPerBevelStrokeRect = SK_ARRAY_COUNT(gBevelStrokeAARectI
dx); |
418 static const int kVertsPerBevelStrokeRect = 24; | 421 static const int kVertsPerBevelStrokeRect = 24; |
419 static const int kNumBevelStrokeRectsInIndexBuffer = 256; | 422 static const int kNumBevelStrokeRectsInIndexBuffer = 256; |
420 | 423 |
421 static int aa_stroke_rect_index_count(bool miterStroke) { | 424 static int aa_stroke_rect_index_count(bool miterStroke) { |
422 return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) : | 425 return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) : |
423 SK_ARRAY_COUNT(gBevelStrokeAARectIdx); | 426 SK_ARRAY_COUNT(gBevelStrokeAARectIdx); |
424 } | 427 } |
425 | 428 |
426 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(bool miterStroke) { | 429 static GrIndexBuffer* setup_aa_stroke_rect_indexbuffer(GrIndexBuffer** aaMiterSt
rokeRectIndexBuffer, |
| 430 GrIndexBuffer** aaBevelSt
rokeRectIndexBuffer, |
| 431 GrGpu* gpu, |
| 432 bool miterStroke) { |
427 if (miterStroke) { | 433 if (miterStroke) { |
428 if (NULL == fAAMiterStrokeRectIndexBuffer) { | 434 if (!*aaMiterStrokeRectIndexBuffer) { |
429 fAAMiterStrokeRectIndexBuffer = | 435 *aaMiterStrokeRectIndexBuffer = |
430 fGpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx, | 436 gpu->createInstancedIndexBuffer(gMiterStrokeAARectIdx, |
431 kIndicesPerMiterStrokeRect, | 437 kIndicesPerMiterStrokeRect, |
432 kNumMiterStrokeRectsInIndex
Buffer, | 438 kNumMiterStrokeRectsInIndexB
uffer, |
433 kVertsPerMiterStrokeRect); | 439 kVertsPerMiterStrokeRect); |
434 } | 440 } |
435 return fAAMiterStrokeRectIndexBuffer; | 441 return *aaMiterStrokeRectIndexBuffer; |
436 } else { | 442 } else { |
437 if (NULL == fAABevelStrokeRectIndexBuffer) { | 443 if (!*aaBevelStrokeRectIndexBuffer) { |
438 fAABevelStrokeRectIndexBuffer = | 444 *aaBevelStrokeRectIndexBuffer = |
439 fGpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx, | 445 gpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx, |
440 kIndicesPerBevelStrokeRect, | 446 kIndicesPerBevelStrokeRect, |
441 kNumBevelStrokeRectsInIndex
Buffer, | 447 kNumBevelStrokeRectsInIndexB
uffer, |
442 kVertsPerBevelStrokeRect); | 448 kVertsPerBevelStrokeRect); |
443 } | 449 } |
444 return fAABevelStrokeRectIndexBuffer; | 450 return *aaBevelStrokeRectIndexBuffer; |
445 } | 451 } |
446 } | 452 } |
447 | 453 |
448 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target, | 454 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target, |
449 GrPipelineBuilder* pipelineBuilder, | 455 GrPipelineBuilder* pipelineBuilder, |
450 GrColor color, | 456 GrColor color, |
451 const SkMatrix& viewMatrix, | 457 const SkMatrix& viewMatrix, |
452 const SkRect& rect, | 458 const SkRect& rect, |
453 const SkRect& devRect) { | 459 const SkRect& devRect) { |
454 if (!fAAFillRectIndexBuffer) { | 460 if (!fAAFillRectIndexBuffer) { |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 bool fCoverageIgnored; | 851 bool fCoverageIgnored; |
846 bool fMiterStroke; | 852 bool fMiterStroke; |
847 bool fCanTweakAlphaForCoverage; | 853 bool fCanTweakAlphaForCoverage; |
848 }; | 854 }; |
849 | 855 |
850 BatchTracker fBatch; | 856 BatchTracker fBatch; |
851 const GrIndexBuffer* fIndexBuffer; | 857 const GrIndexBuffer* fIndexBuffer; |
852 SkSTArray<1, Geometry, true> fGeoData; | 858 SkSTArray<1, Geometry, true> fGeoData; |
853 }; | 859 }; |
854 | 860 |
855 | |
856 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target, | 861 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target, |
857 GrPipelineBuilder* pipelineBuilder, | 862 GrPipelineBuilder* pipelineBuilder, |
858 GrColor color, | 863 GrColor color, |
859 const SkMatrix& viewMatrix, | 864 const SkMatrix& viewMatrix, |
860 const SkRect& devOutside, | 865 const SkRect& devOutside, |
861 const SkRect& devOutsideAssist, | 866 const SkRect& devOutsideAssist, |
862 const SkRect& devInside, | 867 const SkRect& devInside, |
863 bool miterStroke) { | 868 bool miterStroke) { |
864 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(miterStroke); | 869 GrIndexBuffer* indexBuffer = setup_aa_stroke_rect_indexbuffer(&fAAMiterStrok
eRectIndexBuffer, |
| 870 &fAABevelStrok
eRectIndexBuffer, |
| 871 fGpu, |
| 872 miterStroke); |
865 if (!indexBuffer) { | 873 if (!indexBuffer) { |
866 SkDebugf("Failed to create index buffer!\n"); | 874 SkDebugf("Failed to create index buffer!\n"); |
867 return; | 875 return; |
868 } | 876 } |
869 | 877 |
870 AAStrokeRectBatch::Geometry geometry; | 878 AAStrokeRectBatch::Geometry geometry; |
871 geometry.fColor = color; | 879 geometry.fColor = color; |
872 geometry.fDevOutside = devOutside; | 880 geometry.fDevOutside = devOutside; |
873 geometry.fDevOutsideAssist = devOutsideAssist; | 881 geometry.fDevOutsideAssist = devOutsideAssist; |
874 geometry.fDevInside = devInside; | 882 geometry.fDevInside = devInside; |
(...skipping 17 matching lines...) Expand all Loading... |
892 viewMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2); | 900 viewMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2); |
893 | 901 |
894 if (devInside.isEmpty()) { | 902 if (devInside.isEmpty()) { |
895 this->fillAARect(target, pipelineBuilder, color, viewMatrix, devOutside,
devOutside); | 903 this->fillAARect(target, pipelineBuilder, color, viewMatrix, devOutside,
devOutside); |
896 return; | 904 return; |
897 } | 905 } |
898 | 906 |
899 this->geometryStrokeAARect(target, pipelineBuilder, color, viewMatrix, devOu
tside, | 907 this->geometryStrokeAARect(target, pipelineBuilder, color, viewMatrix, devOu
tside, |
900 devOutsideAssist, devInside, true); | 908 devOutsideAssist, devInside, true); |
901 } | 909 } |
| 910 |
| 911 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 912 |
| 913 #ifdef GR_TEST_UTILS |
| 914 |
| 915 BATCH_TEST_DEFINE(AAFillRectBatch) { |
| 916 AAFillRectBatch::Geometry geo; |
| 917 geo.fColor = GrRandomColor(random); |
| 918 geo.fViewMatrix = GrTest::TestMatrix(random); |
| 919 geo.fRect = GrTest::TestRect(random); |
| 920 geo.fDevRect = GrTest::TestRect(random); |
| 921 |
| 922 static GrIndexBuffer* aaFillRectIndexBuffer = NULL; |
| 923 if (!aaFillRectIndexBuffer) { |
| 924 aaFillRectIndexBuffer = |
| 925 context->getGpu()->createInstancedIndexBuffer(gFillAARectIdx, |
| 926 kIndicesPerAAFillR
ect, |
| 927 kNumAAFillRectsInI
ndexBuffer, |
| 928 kVertsPerAAFillRec
t); |
| 929 } |
| 930 |
| 931 return AAFillRectBatch::Create(geo, aaFillRectIndexBuffer); |
| 932 } |
| 933 |
| 934 BATCH_TEST_DEFINE(AAStrokeRectBatch) { |
| 935 static GrIndexBuffer* aaMiterStrokeRectIndexBuffer = NULL; |
| 936 static GrIndexBuffer* aaBevelStrokeRectIndexBuffer = NULL; |
| 937 |
| 938 bool miterStroke = random->nextBool(); |
| 939 |
| 940 GrIndexBuffer* indexBuffer = setup_aa_stroke_rect_indexbuffer(&aaMiterStroke
RectIndexBuffer, |
| 941 &aaBevelStroke
RectIndexBuffer, |
| 942 context->getGp
u(), |
| 943 miterStroke); |
| 944 |
| 945 // Create mock stroke rect |
| 946 SkRect outside = GrTest::TestRect(random); |
| 947 SkScalar minDim = SkMinScalar(outside.width(), outside.height()); |
| 948 SkScalar strokeWidth = minDim * 0.1f; |
| 949 SkRect outsideAssist = outside; |
| 950 outsideAssist.outset(strokeWidth, strokeWidth); |
| 951 SkRect inside = outside; |
| 952 inside.inset(strokeWidth, strokeWidth); |
| 953 |
| 954 AAStrokeRectBatch::Geometry geo; |
| 955 geo.fColor = GrRandomColor(random); |
| 956 geo.fDevOutside = outside; |
| 957 geo.fDevOutsideAssist = outsideAssist; |
| 958 geo.fDevInside = inside; |
| 959 geo.fMiterStroke = miterStroke; |
| 960 |
| 961 return AAStrokeRectBatch::Create(geo, GrTest::TestMatrix(random), indexBuffe
r); |
| 962 } |
| 963 |
| 964 #endif |
OLD | NEW |