OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 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 #include "GrAARectRenderer.h" | 9 #include "GrAARectRenderer.h" |
10 #include "GrAtlasTextContext.h" | 10 #include "GrAtlasTextContext.h" |
11 #include "GrBatchTest.h" | 11 #include "GrBatchTest.h" |
12 #include "GrColor.h" | 12 #include "GrColor.h" |
13 #include "GrDefaultGeoProcFactory.h" | 13 #include "GrDefaultGeoProcFactory.h" |
14 #include "GrDrawContext.h" | 14 #include "GrDrawContext.h" |
15 #include "GrOvalRenderer.h" | 15 #include "GrOvalRenderer.h" |
16 #include "GrPathRenderer.h" | 16 #include "GrPathRenderer.h" |
17 #include "GrRenderTarget.h" | 17 #include "GrRenderTarget.h" |
18 #include "GrRenderTargetPriv.h" | 18 #include "GrRenderTargetPriv.h" |
19 #include "GrStencilAndCoverTextContext.h" | 19 #include "GrStencilAndCoverTextContext.h" |
20 | 20 |
21 #include "batches/GrBatch.h" | 21 #include "batches/GrBatch.h" |
| 22 #include "batches/GrDrawAtlasBatch.h" |
22 #include "batches/GrStrokeRectBatch.h" | 23 #include "batches/GrStrokeRectBatch.h" |
23 | 24 |
24 #include "SkGr.h" | 25 #include "SkGr.h" |
25 #include "SkRSXform.h" | 26 #include "SkRSXform.h" |
26 | 27 |
27 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fContext) | 28 #define ASSERT_OWNED_RESOURCE(R) SkASSERT(!(R) || (R)->getContext() == fContext) |
28 #define RETURN_IF_ABANDONED if (!fDrawTarget) { return; } | 29 #define RETURN_IF_ABANDONED if (!fDrawTarget) { return; } |
29 #define RETURN_FALSE_IF_ABANDONED if (!fDrawTarget) { return false; } | 30 #define RETURN_FALSE_IF_ABANDONED if (!fDrawTarget) { return false; } |
30 #define RETURN_NULL_IF_ABANDONED if (!fDrawTarget) { return NULL; } | 31 #define RETURN_NULL_IF_ABANDONED if (!fDrawTarget) { return NULL; } |
31 | 32 |
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 SkAutoTUnref<GrBatch> batch(DrawVerticesBatch::Create(geometry, primitiveTyp
e, viewMatrix, | 689 SkAutoTUnref<GrBatch> batch(DrawVerticesBatch::Create(geometry, primitiveTyp
e, viewMatrix, |
689 positions, vertexCount
, indices, | 690 positions, vertexCount
, indices, |
690 indexCount, colors, te
xCoords, | 691 indexCount, colors, te
xCoords, |
691 bounds)); | 692 bounds)); |
692 | 693 |
693 fDrawTarget->drawBatch(pipelineBuilder, batch); | 694 fDrawTarget->drawBatch(pipelineBuilder, batch); |
694 } | 695 } |
695 | 696 |
696 /////////////////////////////////////////////////////////////////////////////// | 697 /////////////////////////////////////////////////////////////////////////////// |
697 | 698 |
698 class DrawAtlasBatch : public GrBatch { | |
699 public: | |
700 struct Geometry { | |
701 GrColor fColor; | |
702 SkTDArray<SkPoint> fPositions; | |
703 SkTDArray<GrColor> fColors; | |
704 SkTDArray<SkPoint> fLocalCoords; | |
705 }; | |
706 | |
707 static GrBatch* Create(const Geometry& geometry, const SkMatrix& viewMatrix, | |
708 const SkPoint* positions, int vertexCount, | |
709 const GrColor* colors, const SkPoint* localCoords, | |
710 const SkRect& bounds) { | |
711 return SkNEW_ARGS(DrawAtlasBatch, (geometry, viewMatrix, positions, | |
712 vertexCount, colors, localCoords, bou
nds)); | |
713 } | |
714 | |
715 const char* name() const override { return "DrawAtlasBatch"; } | |
716 | |
717 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | |
718 // When this is called on a batch, there is only one geometry bundle | |
719 if (this->hasColors()) { | |
720 out->setUnknownFourComponents(); | |
721 } else { | |
722 out->setKnownFourComponents(fGeoData[0].fColor); | |
723 } | |
724 } | |
725 | |
726 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const override { | |
727 out->setKnownSingleComponent(0xff); | |
728 } | |
729 | |
730 void initBatchTracker(const GrPipelineInfo& init) override { | |
731 // Handle any color overrides | |
732 if (!init.readsColor()) { | |
733 fGeoData[0].fColor = GrColor_ILLEGAL; | |
734 } | |
735 init.getOverrideColorIfSet(&fGeoData[0].fColor); | |
736 | |
737 // setup batch properties | |
738 fColorIgnored = !init.readsColor(); | |
739 fColor = fGeoData[0].fColor; | |
740 SkASSERT(init.readsLocalCoords()); | |
741 fCoverageIgnored = !init.readsCoverage(); | |
742 } | |
743 | |
744 void generateGeometry(GrBatchTarget* batchTarget) override { | |
745 int colorOffset = -1, texOffset = -1; | |
746 // Setup geometry processor | |
747 SkAutoTUnref<const GrGeometryProcessor> gp( | |
748 set_vertex_attributes(true, this->hasColors(), &
colorOffset, | |
749 &texOffset, this->color(),
this->viewMatrix(), | |
750 this->coverageIgnored())); | |
751 | |
752 batchTarget->initDraw(gp, this->pipeline()); | |
753 | |
754 int instanceCount = fGeoData.count(); | |
755 size_t vertexStride = gp->getVertexStride(); | |
756 SkASSERT(vertexStride == sizeof(SkPoint) + sizeof(SkPoint) | |
757 + (this->hasColors() ? sizeof(GrColor) : 0)); | |
758 | |
759 QuadHelper helper; | |
760 int numQuads = this->vertexCount()/4; | |
761 void* verts = helper.init(batchTarget, vertexStride, numQuads); | |
762 if (!verts) { | |
763 SkDebugf("Could not allocate vertices\n"); | |
764 return; | |
765 } | |
766 | |
767 int vertexOffset = 0; | |
768 for (int i = 0; i < instanceCount; i++) { | |
769 const Geometry& args = fGeoData[i]; | |
770 | |
771 for (int j = 0; j < args.fPositions.count(); ++j) { | |
772 *((SkPoint*)verts) = args.fPositions[j]; | |
773 if (this->hasColors()) { | |
774 *(GrColor*)((intptr_t)verts + colorOffset) = args.fColors[j]
; | |
775 } | |
776 *(SkPoint*)((intptr_t)verts + texOffset) = args.fLocalCoords[j]; | |
777 verts = (void*)((intptr_t)verts + vertexStride); | |
778 vertexOffset++; | |
779 } | |
780 } | |
781 helper.issueDraw(batchTarget); | |
782 } | |
783 | |
784 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | |
785 | |
786 private: | |
787 DrawAtlasBatch(const Geometry& geometry, const SkMatrix& viewMatrix, | |
788 const SkPoint* positions, int vertexCount, | |
789 const GrColor* colors, const SkPoint* localCoords, const SkRe
ct& bounds) { | |
790 this->initClassID<DrawVerticesBatch>(); | |
791 SkASSERT(positions); | |
792 SkASSERT(localCoords); | |
793 | |
794 fViewMatrix = viewMatrix; | |
795 Geometry& installedGeo = fGeoData.push_back(geometry); | |
796 | |
797 installedGeo.fPositions.append(vertexCount, positions); | |
798 | |
799 if (colors) { | |
800 installedGeo.fColors.append(vertexCount, colors); | |
801 fHasColors = true; | |
802 } else { | |
803 fHasColors = false; | |
804 } | |
805 | |
806 installedGeo.fLocalCoords.append(vertexCount, localCoords); | |
807 fVertexCount = vertexCount; | |
808 | |
809 this->setBounds(bounds); | |
810 } | |
811 | |
812 GrColor color() const { return fColor; } | |
813 bool colorIgnored() const { return fColorIgnored; } | |
814 const SkMatrix& viewMatrix() const { return fViewMatrix; } | |
815 bool hasColors() const { return fHasColors; } | |
816 int vertexCount() const { return fVertexCount; } | |
817 bool coverageIgnored() const { return fCoverageIgnored; } | |
818 | |
819 bool onCombineIfPossible(GrBatch* t) override { | |
820 if (!this->pipeline()->isEqual(*t->pipeline())) { | |
821 return false; | |
822 } | |
823 | |
824 DrawAtlasBatch* that = t->cast<DrawAtlasBatch>(); | |
825 | |
826 // We currently use a uniform viewmatrix for this batch | |
827 if (!this->viewMatrix().cheapEqualTo(that->viewMatrix())) { | |
828 return false; | |
829 } | |
830 | |
831 if (this->hasColors() != that->hasColors()) { | |
832 return false; | |
833 } | |
834 | |
835 if (!this->hasColors() && this->color() != that->color()) { | |
836 return false; | |
837 } | |
838 | |
839 if (this->color() != that->color()) { | |
840 fColor = GrColor_ILLEGAL; | |
841 } | |
842 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; | |
843 fVertexCount += that->vertexCount(); | |
844 | |
845 this->joinBounds(that->bounds()); | |
846 return true; | |
847 } | |
848 | |
849 SkSTArray<1, Geometry, true> fGeoData; | |
850 | |
851 SkMatrix fViewMatrix; | |
852 GrColor fColor; | |
853 int fVertexCount; | |
854 bool fColorIgnored; | |
855 bool fCoverageIgnored; | |
856 bool fHasColors; | |
857 }; | |
858 | |
859 void GrDrawContext::drawAtlas(GrRenderTarget* rt, | 699 void GrDrawContext::drawAtlas(GrRenderTarget* rt, |
860 const GrClip& clip, | 700 const GrClip& clip, |
861 const GrPaint& paint, | 701 const GrPaint& paint, |
862 const SkMatrix& viewMatrix, | 702 const SkMatrix& viewMatrix, |
863 int spriteCount, | 703 int spriteCount, |
864 const SkRSXform xform[], | 704 const SkRSXform xform[], |
865 const SkRect texRect[], | 705 const SkRect texRect[], |
866 const SkColor colors[]) { | 706 const SkColor colors[]) { |
867 RETURN_IF_ABANDONED | 707 RETURN_IF_ABANDONED |
868 AutoCheckFlush acf(fContext); | 708 AutoCheckFlush acf(fContext); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
918 | 758 |
919 vertCols[0] = vertCols[1] = vertCols[2] = vertCols[3] = grColor; | 759 vertCols[0] = vertCols[1] = vertCols[2] = vertCols[3] = grColor; |
920 vertCols += 4; | 760 vertCols += 4; |
921 } | 761 } |
922 } | 762 } |
923 | 763 |
924 verts = vertStorage.get(); | 764 verts = vertStorage.get(); |
925 texs = verts + vertCount; | 765 texs = verts + vertCount; |
926 vertCols = colorStorage.get(); | 766 vertCols = colorStorage.get(); |
927 | 767 |
928 DrawAtlasBatch::Geometry geometry; | 768 GrDrawAtlasBatch::Geometry geometry; |
929 geometry.fColor = paint.getColor(); | 769 geometry.fColor = paint.getColor(); |
930 SkAutoTUnref<GrBatch> batch(DrawAtlasBatch::Create(geometry, viewMatrix, ver
ts, vertCount, | 770 SkAutoTUnref<GrBatch> batch(GrDrawAtlasBatch::Create(geometry, viewMatrix, v
erts, vertCount, |
931 vertCols, texs, bounds)); | 771 vertCols, texs, bounds)
); |
932 | 772 |
933 fDrawTarget->drawBatch(pipelineBuilder, batch); | 773 fDrawTarget->drawBatch(pipelineBuilder, batch); |
934 } | 774 } |
935 | 775 |
936 /////////////////////////////////////////////////////////////////////////////// | 776 /////////////////////////////////////////////////////////////////////////////// |
937 | 777 |
938 void GrDrawContext::drawRRect(GrRenderTarget*rt, | 778 void GrDrawContext::drawRRect(GrRenderTarget*rt, |
939 const GrClip& clip, | 779 const GrClip& clip, |
940 const GrPaint& paint, | 780 const GrPaint& paint, |
941 const SkMatrix& viewMatrix, | 781 const SkMatrix& viewMatrix, |
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1379 return DrawVerticesBatch::Create(geometry, type, viewMatrix, | 1219 return DrawVerticesBatch::Create(geometry, type, viewMatrix, |
1380 positions.begin(), vertexCount, | 1220 positions.begin(), vertexCount, |
1381 indices.begin(), hasIndices ? vertexCount :
0, | 1221 indices.begin(), hasIndices ? vertexCount :
0, |
1382 colors.begin(), | 1222 colors.begin(), |
1383 texCoords.begin(), | 1223 texCoords.begin(), |
1384 bounds); | 1224 bounds); |
1385 } | 1225 } |
1386 | 1226 |
1387 #endif | 1227 #endif |
1388 | 1228 |
OLD | NEW |