Index: src/gpu/GrContext.cpp |
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp |
index 58e8508e370528f68493c0e8488e3fad8cc59873..e26c57f9f6553d651c4aa532361d6dc4ae02332d 100755 |
--- a/src/gpu/GrContext.cpp |
+++ b/src/gpu/GrContext.cpp |
@@ -13,6 +13,7 @@ |
#include "GrBatch.h" |
#include "GrBatchFontCache.h" |
#include "GrBatchTarget.h" |
+#include "GrBatchTest.h" |
#include "GrDefaultGeoProcFactory.h" |
#include "GrGpuResource.h" |
#include "GrGpuResourcePriv.h" |
@@ -1866,3 +1867,130 @@ void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { |
fDrawBuffer->removeGpuTraceMarker(marker); |
} |
} |
+ |
+/////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+#ifdef GR_TEST_UTILS |
+ |
+BATCH_TEST_DEFINE(StrokeRect) { |
+ StrokeRectBatch::Geometry geometry; |
+ geometry.fViewMatrix = GrTest::TestMatrix(random); |
+ geometry.fColor = GrRandomColor(random); |
+ geometry.fRect = GrTest::TestRect(random); |
+ geometry.fStrokeWidth = random->nextBool() ? 0.0f : 1.0f; |
+ |
+ return StrokeRectBatch::Create(geometry); |
+} |
+ |
+static uint32_t seed_vertices(GrPrimitiveType type) { |
+ switch (type) { |
+ case kTriangles_GrPrimitiveType: |
+ case kTriangleStrip_GrPrimitiveType: |
+ case kTriangleFan_GrPrimitiveType: |
+ return 3; |
+ case kPoints_GrPrimitiveType: |
+ return 1; |
+ case kLines_GrPrimitiveType: |
+ case kLineStrip_GrPrimitiveType: |
+ return 2; |
+ } |
+ SkFAIL("Incomplete switch\n"); |
+ return 0; |
+} |
+ |
+static uint32_t primitive_vertices(GrPrimitiveType type) { |
+ switch (type) { |
+ case kTriangles_GrPrimitiveType: |
+ return 3; |
+ case kLines_GrPrimitiveType: |
+ return 2; |
+ case kTriangleStrip_GrPrimitiveType: |
+ case kTriangleFan_GrPrimitiveType: |
+ case kPoints_GrPrimitiveType: |
+ case kLineStrip_GrPrimitiveType: |
+ return 1; |
+ } |
+ SkFAIL("Incomplete switch\n"); |
+ return 0; |
+} |
+ |
+static SkPoint random_point(SkRandom* random, SkScalar min, SkScalar max) { |
+ SkPoint p; |
+ p.fX = random->nextRangeScalar(min, max); |
+ p.fY = random->nextRangeScalar(min, max); |
+ return p; |
+} |
+ |
+static void randomize_params(size_t count, size_t maxVertex, SkScalar min, SkScalar max, |
+ SkRandom* random, |
+ SkTArray<SkPoint>* positions, |
+ SkTArray<SkPoint>* texCoords, bool hasTexCoords, |
+ SkTArray<GrColor>* colors, bool hasColors, |
+ SkTArray<uint16_t>* indices, bool hasIndices) { |
+ for (uint32_t v = 0; v < count; v++) { |
+ positions->push_back(random_point(random, min, max)); |
+ if (hasTexCoords) { |
+ texCoords->push_back(random_point(random, min, max)); |
+ } |
+ if (hasColors) { |
+ colors->push_back(GrRandomColor(random)); |
+ } |
+ if (hasIndices) { |
+ SkASSERT(maxVertex <= SK_MaxU16); |
+ indices->push_back(random->nextULessThan((uint16_t)maxVertex)); |
+ } |
+ } |
+} |
+ |
+BATCH_TEST_DEFINE(Vertices) { |
+ GrPrimitiveType type = GrPrimitiveType(random->nextULessThan(kLast_GrPrimitiveType + 1)); |
+ uint32_t primitiveCount = random->nextRangeU(1, 100); |
+ |
+ // TODO make 'sensible' indexbuffers |
+ SkTArray<SkPoint> positions; |
+ SkTArray<SkPoint> texCoords; |
+ SkTArray<GrColor> colors; |
+ SkTArray<uint16_t> indices; |
+ |
+ bool hasTexCoords = random->nextBool(); |
+ bool hasIndices = random->nextBool(); |
+ bool hasColors = random->nextBool(); |
+ |
+ uint32_t vertexCount = seed_vertices(type) + (primitiveCount - 1) * primitive_vertices(type); |
+ |
+ static const SkScalar kMinVertExtent = -100.f; |
+ static const SkScalar kMaxVertExtent = 100.f; |
+ randomize_params(seed_vertices(type), vertexCount, kMinVertExtent, kMaxVertExtent, |
+ random, |
+ &positions, |
+ &texCoords, hasTexCoords, |
+ &colors, hasColors, |
+ &indices, hasIndices); |
+ |
+ for (uint32_t i = 1; i < primitiveCount; i++) { |
+ randomize_params(primitive_vertices(type), vertexCount, kMinVertExtent, kMaxVertExtent, |
+ random, |
+ &positions, |
+ &texCoords, hasTexCoords, |
+ &colors, hasColors, |
+ &indices, hasIndices); |
+ } |
+ |
+ SkMatrix viewMatrix = GrTest::TestMatrix(random); |
+ SkRect bounds; |
+ SkDEBUGCODE(bool result = ) bounds.setBoundsCheck(positions.begin(), vertexCount); |
+ SkASSERT(result); |
+ |
+ viewMatrix.mapRect(&bounds); |
+ |
+ DrawVerticesBatch::Geometry geometry; |
+ geometry.fColor = GrRandomColor(random); |
+ return DrawVerticesBatch::Create(geometry, type, viewMatrix, |
+ positions.begin(), vertexCount, |
+ indices.begin(), hasIndices ? vertexCount : 0, |
+ colors.begin(), |
+ texCoords.begin(), |
+ bounds); |
+} |
+ |
+#endif |