Index: tests/GLProgramsTest.cpp |
diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp |
index c643bd567ac4ee393c351a7f32008ebcd17c7b7d..9be082a47bae7d27922bf74d4f17957673098cf7 100644 |
--- a/tests/GLProgramsTest.cpp |
+++ b/tests/GLProgramsTest.cpp |
@@ -12,16 +12,17 @@ |
#if SK_SUPPORT_GPU && SK_ALLOW_STATIC_GLOBAL_INITIALIZERS |
-#include "GrTBackendProcessorFactory.h" |
#include "GrContextFactory.h" |
#include "GrOptDrawState.h" |
-#include "effects/GrConfigConversionEffect.h" |
-#include "gl/builders/GrGLProgramBuilder.h" |
-#include "gl/GrGLPathRendering.h" |
-#include "gl/GrGpuGL.h" |
+#include "GrTBackendProcessorFactory.h" |
+#include "GrTest.h" |
#include "SkChecksum.h" |
#include "SkRandom.h" |
#include "Test.h" |
+#include "effects/GrConfigConversionEffect.h" |
+#include "gl/GrGLPathRendering.h" |
+#include "gl/GrGpuGL.h" |
+#include "gl/builders/GrGLProgramBuilder.h" |
/* |
* A dummy processor which just tries to insert a massive key and verify that it can retrieve the |
@@ -98,7 +99,7 @@ private: |
static const int kRenderTargetHeight = 1; |
static const int kRenderTargetWidth = 1; |
-static GrRenderTarget* random_render_target(GrGpuGL* gpu, |
+static GrRenderTarget* random_render_target(GrContext* context, |
const GrCacheID& cacheId, |
SkRandom* random) { |
// setup render target |
@@ -111,10 +112,9 @@ static GrRenderTarget* random_render_target(GrGpuGL* gpu, |
texDesc.fOrigin = random->nextBool() == true ? kTopLeft_GrSurfaceOrigin : |
kBottomLeft_GrSurfaceOrigin; |
- SkAutoTUnref<GrTexture> texture( |
- gpu->getContext()->findAndRefTexture(texDesc, cacheId, ¶ms)); |
+ SkAutoTUnref<GrTexture> texture(context->findAndRefTexture(texDesc, cacheId, ¶ms)); |
if (!texture) { |
- texture.reset(gpu->getContext()->createTexture(¶ms, texDesc, cacheId, 0, 0)); |
+ texture.reset(context->createTexture(¶ms, texDesc, cacheId, 0, 0)); |
if (!texture) { |
return NULL; |
} |
@@ -166,11 +166,15 @@ static void setup_random_ff_attribute(GrVertexAttribBinding binding, GrVertexAtt |
} |
} |
-static void set_random_gp(GrGpuGL* gpu, SkRandom* random, GrTexture* dummyTextures[]) { |
+static void set_random_gp(GrContext* context, |
+ const GrDrawTargetCaps& caps, |
+ GrDrawState* ds, |
+ SkRandom* random, |
+ GrTexture* dummyTextures[]) { |
GrProgramElementRef<const GrGeometryProcessor> gp( |
GrProcessorTestFactory<GrGeometryProcessor>::CreateStage(random, |
- gpu->getContext(), |
- *gpu->caps(), |
+ context, |
+ caps, |
dummyTextures)); |
SkASSERT(gp); |
@@ -208,12 +212,12 @@ static void set_random_gp(GrGpuGL* gpu, SkRandom* random, GrTexture* dummyTextur |
} |
// update the vertex attributes with the ds |
- GrDrawState* ds = gpu->drawState(); |
ds->setVertexAttribs<kGenericVertexAttribs>(attribIndex + numGPAttribs, runningStride); |
ds->setGeometryProcessor(gp); |
} |
static void set_random_color_coverage_stages(GrGpuGL* gpu, |
+ GrDrawState* ds, |
int maxStages, |
bool usePathRendering, |
SkRandom* random, |
@@ -248,7 +252,6 @@ static void set_random_color_coverage_stages(GrGpuGL* gpu, |
} |
// finally add the stage to the correct pipeline in the drawstate |
- GrDrawState* ds = gpu->drawState(); |
if (s < numColorProcs) { |
ds->addColorProcessor(fp); |
} else { |
@@ -267,7 +270,7 @@ enum ColorMode { |
kLast_ColorMode = kRandom_ColorMode |
}; |
-static void set_random_color(GrGpuGL* gpu, SkRandom* random) { |
+static void set_random_color(GrDrawState* ds, SkRandom* random) { |
ColorMode colorMode = ColorMode(random->nextULessThan(kLast_ColorMode + 1)); |
GrColor color; |
switch (colorMode) { |
@@ -292,7 +295,7 @@ static void set_random_color(GrGpuGL* gpu, SkRandom* random) { |
break; |
} |
GrColorIsPMAssert(color); |
- gpu->drawState()->setColor(color); |
+ ds->setColor(color); |
} |
// There are only a few cases of random coverages which interest us |
@@ -303,7 +306,7 @@ enum CoverageMode { |
kLast_CoverageMode = kRandom_CoverageMode |
}; |
-static void set_random_coverage(GrGpuGL* gpu, SkRandom* random) { |
+static void set_random_coverage(GrDrawState* ds, SkRandom* random) { |
CoverageMode coverageMode = CoverageMode(random->nextULessThan(kLast_CoverageMode + 1)); |
uint8_t coverage; |
switch (coverageMode) { |
@@ -317,25 +320,25 @@ static void set_random_coverage(GrGpuGL* gpu, SkRandom* random) { |
coverage = uint8_t(random->nextU()); |
break; |
} |
- gpu->drawState()->setCoverage(coverage); |
+ ds->setCoverage(coverage); |
} |
-static void set_random_hints(GrGpuGL* gpu, SkRandom* random) { |
+static void set_random_hints(GrDrawState* ds, SkRandom* random) { |
for (int i = 1; i <= GrDrawState::kLast_Hint; i <<= 1) { |
- gpu->drawState()->setHint(GrDrawState::Hints(i), random->nextBool()); |
+ ds->setHint(GrDrawState::Hints(i), random->nextBool()); |
} |
} |
-static void set_random_state(GrGpuGL* gpu, SkRandom* random) { |
+static void set_random_state(GrDrawState* ds, SkRandom* random) { |
int state = 0; |
for (int i = 1; i <= GrDrawState::kLast_StateBit; i <<= 1) { |
state |= random->nextBool() * i; |
} |
- gpu->drawState()->enableState(state); |
+ ds->enableState(state); |
} |
// this function will randomly pick non-self referencing blend modes |
-static void set_random_blend_func(GrGpuGL* gpu, SkRandom* random) { |
+static void set_random_blend_func(GrDrawState* ds, SkRandom* random) { |
GrBlendCoeff src; |
do { |
src = GrBlendCoeff(random->nextRangeU(kFirstPublicGrBlendCoeff, kLastPublicGrBlendCoeff)); |
@@ -346,11 +349,11 @@ static void set_random_blend_func(GrGpuGL* gpu, SkRandom* random) { |
dst = GrBlendCoeff(random->nextRangeU(kFirstPublicGrBlendCoeff, kLastPublicGrBlendCoeff)); |
} while (GrBlendCoeffRefsDst(dst)); |
- gpu->drawState()->setBlendFunc(src, dst); |
+ ds->setBlendFunc(src, dst); |
} |
// right now, the only thing we seem to care about in drawState's stencil is 'doesWrite()' |
-static void set_random_stencil(GrGpuGL* gpu, SkRandom* random) { |
+static void set_random_stencil(GrDrawState* ds, SkRandom* random) { |
GR_STATIC_CONST_SAME_STENCIL(kDoesWriteStencil, |
kReplace_StencilOp, |
kReplace_StencilOp, |
@@ -367,25 +370,26 @@ static void set_random_stencil(GrGpuGL* gpu, SkRandom* random) { |
0xffff); |
if (random->nextBool()) { |
- gpu->drawState()->setStencil(kDoesWriteStencil); |
+ ds->setStencil(kDoesWriteStencil); |
} else { |
- gpu->drawState()->setStencil(kDoesNotWriteStencil); |
+ ds->setStencil(kDoesNotWriteStencil); |
} |
} |
-bool GrGpuGL::programUnitTest(int maxStages) { |
+bool GrDrawTarget::programUnitTest(int maxStages) { |
+ GrGpuGL* gpu = static_cast<GrGpuGL*>(fContext->getGpu()); |
// setup dummy textures |
GrSurfaceDesc dummyDesc; |
dummyDesc.fFlags = kRenderTarget_GrSurfaceFlag; |
dummyDesc.fConfig = kSkia8888_GrPixelConfig; |
dummyDesc.fWidth = 34; |
dummyDesc.fHeight = 18; |
- SkAutoTUnref<GrTexture> dummyTexture1(this->createTexture(dummyDesc, NULL, 0)); |
+ SkAutoTUnref<GrTexture> dummyTexture1(gpu->createTexture(dummyDesc, NULL, 0)); |
dummyDesc.fFlags = kNone_GrSurfaceFlags; |
dummyDesc.fConfig = kAlpha_8_GrPixelConfig; |
dummyDesc.fWidth = 16; |
dummyDesc.fHeight = 22; |
- SkAutoTUnref<GrTexture> dummyTexture2(this->createTexture(dummyDesc, NULL, 0)); |
+ SkAutoTUnref<GrTexture> dummyTexture2(gpu->createTexture(dummyDesc, NULL, 0)); |
if (!dummyTexture1 || ! dummyTexture2) { |
SkDebugf("Could not allocate dummy textures"); |
@@ -403,8 +407,8 @@ bool GrGpuGL::programUnitTest(int maxStages) { |
GrCacheID glProgramsCacheID(glProgramsDomain, key); |
// setup clip |
- SkRect screen = |
- SkRect::MakeWH(SkIntToScalar(kRenderTargetWidth), SkIntToScalar(kRenderTargetHeight)); |
+ SkRect screen = SkRect::MakeWH(SkIntToScalar(kRenderTargetWidth), |
+ SkIntToScalar(kRenderTargetHeight)); |
SkClipStack stack; |
stack.clipDevRect(screen, SkRegion::kReplace_Op, false); |
@@ -418,8 +422,8 @@ bool GrGpuGL::programUnitTest(int maxStages) { |
static const int NUM_TESTS = 512; |
for (int t = 0; t < NUM_TESTS;) { |
// setup random render target(can fail) |
- SkAutoTUnref<GrRenderTarget> rt(random_render_target(this, glProgramsCacheID, &random)); |
- if (!rt) { |
+ SkAutoTUnref<GrRenderTarget> rt(random_render_target(fContext, glProgramsCacheID, &random)); |
+ if (!rt.get()) { |
SkDebugf("Could not allocate render target"); |
return false; |
} |
@@ -428,7 +432,7 @@ bool GrGpuGL::programUnitTest(int maxStages) { |
ds->setRenderTarget(rt.get()); |
// if path rendering we have to setup a couple of things like the draw type |
- bool usePathRendering = this->glCaps().pathRenderingSupport() && random.nextBool(); |
+ bool usePathRendering = gpu->glCaps().pathRenderingSupport() && random.nextBool(); |
GrGpu::DrawType drawType = usePathRendering ? GrGpu::kDrawPath_DrawType : |
GrGpu::kDrawPoints_DrawType; |
@@ -436,16 +440,20 @@ bool GrGpuGL::programUnitTest(int maxStages) { |
// twiddle drawstate knobs randomly |
bool hasGeometryProcessor = usePathRendering ? false : random.nextBool(); |
if (hasGeometryProcessor) { |
- set_random_gp(this, &random, dummyTextures); |
+ set_random_gp(fContext, gpu->glCaps(), ds, &random, dummyTextures); |
} |
- set_random_color_coverage_stages(this, maxStages - hasGeometryProcessor, usePathRendering, |
- &random, dummyTextures); |
- set_random_color(this, &random); |
- set_random_coverage(this, &random); |
- set_random_hints(this, &random); |
- set_random_state(this, &random); |
- set_random_blend_func(this, &random); |
- set_random_stencil(this, &random); |
+ set_random_color_coverage_stages(gpu, |
+ ds, |
+ maxStages - hasGeometryProcessor, |
+ usePathRendering, |
+ &random, |
+ dummyTextures); |
+ set_random_color(ds, &random); |
+ set_random_coverage(ds, &random); |
+ set_random_hints(ds, &random); |
+ set_random_state(ds, &random); |
+ set_random_blend_func(ds, &random); |
+ set_random_stencil(ds, &random); |
GrDeviceCoordTexture dstCopy; |
@@ -457,14 +465,14 @@ bool GrGpuGL::programUnitTest(int maxStages) { |
// create optimized draw state, setup readDst texture if required, and build a descriptor |
// and program. ODS creation can fail, so we have to check |
SkAutoTUnref<GrOptDrawState> ods(GrOptDrawState::Create(this->getDrawState(), |
- this, |
+ gpu, |
&dstCopy, |
drawType)); |
if (!ods.get()) { |
ds->reset(); |
continue; |
} |
- SkAutoTUnref<GrGLProgram> program(GrGLProgramBuilder::CreateProgram(*ods, drawType, this)); |
+ SkAutoTUnref<GrGLProgram> program(GrGLProgramBuilder::CreateProgram(*ods, drawType, gpu)); |
if (NULL == program.get()) { |
SkDebugf("Failed to create program!"); |
return false; |
@@ -507,7 +515,9 @@ DEF_GPUTEST(GLPrograms, reporter, factory) { |
maxStages = 3; |
} |
#endif |
- REPORTER_ASSERT(reporter, gpu->programUnitTest(maxStages)); |
+ GrTestTarget target; |
+ context->getTestTarget(&target); |
+ REPORTER_ASSERT(reporter, target.target()->programUnitTest(maxStages)); |
} |
} |
} |