SkScalar nextUScalar1() { return SkFixedToScalar(this->nextUFixed1()); }
/** Return the next pseudo random number expressed as a SkScalar
+ in the range [min..max).
+ */
+ SkScalar nextRangeScalar(SkScalar min, SkScalar max) {
+ return SkScalarMul(this->nextSScalar1(), (max - min)) + min;
+ }
+
+ /** Return the next pseudo random number expressed as a SkScalar
in the range (-SK_Scalar1..SK_Scalar1).
*/
SkScalar nextSScalar1() { return SkFixedToScalar(this->nextSFixed1()); }
return NULL;
}
+
+///////////////////////////////////////////////////////////////////////////////
+
+GR_DEFINE_CUSTOM_STAGE_TEST(GrColorTableEffect);
+
+GrCustomStage* GrColorTableEffect::TestCreate(SkRandom* random,
+ GrContext* context,
+ GrTexture* textures[]) {
+ return SkNEW_ARGS(GrColorTableEffect, (textures[GrCustomStageTestFactory::kAlphaTextureIdx]));
+}
typedef GrGLColorTableEffect GLProgramStage;
private:
+ GR_DECLARE_CUSTOM_STAGE_TEST;
GrTextureAccess fTextureAccess;
virtual void setupVariables(GrGLShaderBuilder* builder) SK_OVERRIDE;
virtual void emitVS(GrGLShaderBuilder* builder,
- const char* vertexCoords) SK_OVERRIDE;
+ const char* vertexCoords) SK_OVERRIDE {};
virtual void emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
}
void GrGLConvolutionEffect::setupVariables(GrGLShaderBuilder* builder) {
- fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType |
- GrGLShaderBuilder::kVertex_ShaderType,
+ fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
kVec2f_GrSLType, "ImageIncrement");
fKernelUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderType,
kFloat_GrSLType, "Kernel", this->width());
}
-void GrGLConvolutionEffect::emitVS(GrGLShaderBuilder* builder,
- const char* vertexCoords) {
- SkString* code = &builder->fVSCode;
- const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
- code->appendf("\t\t%s -= vec2(%d, %d) * %s;\n", vertexCoords, fRadius, fRadius, imgInc);
-}
-
void GrGLConvolutionEffect::emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
SkString* code = &builder->fFSCode;
code->appendf("\t\t%s = vec4(0, 0, 0, 0);\n", outputColor);
-
- code->appendf("\t\tvec2 coord = %s;\n", builder->fSampleCoords.c_str());
int width = this ->width();
const GrGLShaderVar& kernel = builder->getUniformVariable(fKernelUni);
const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
+
+ code->appendf("\t\tvec2 coord = %s - %d * %s;\n",
+ builder->fSampleCoords.c_str(), fRadius, imgInc);
+
// Manually unroll loop because some drivers don't; yields 20-30% speedup.
for (int i = 0; i < width; i++) {
SkString index;
this->direction() == s.direction() &&
0 == memcmp(fKernel, s.fKernel, this->width() * sizeof(float)));
}
+
+///////////////////////////////////////////////////////////////////////////////
+
+GR_DEFINE_CUSTOM_STAGE_TEST(GrConvolutionEffect);
+
+GrCustomStage* GrConvolutionEffect::TestCreate(SkRandom* random,
+ GrContext* context,
+ GrTexture* textures[]) {
+ int texIdx = random->nextBool() ? GrCustomStageTestFactory::kSkiaPMTextureIdx :
+ GrCustomStageTestFactory::kAlphaTextureIdx;
+ Direction dir = random->nextBool() ? kX_Direction : kY_Direction;
+ int radius = random->nextRangeU(1, kMaxKernelRadius);
+ float kernel[kMaxKernelRadius];
+ for (int i = 0; i < kMaxKernelRadius; ++i) {
+ kernel[i] = random->nextSScalar1();
+ }
+
+ return SkNEW_ARGS(GrConvolutionEffect, (textures[texIdx], dir, radius, kernel));
+}
+
float fKernel[kMaxKernelWidth];
private:
+ GR_DECLARE_CUSTOM_STAGE_TEST;
typedef Gr1DKernelEffect INHERITED;
};
virtual void setupVariables(GrGLShaderBuilder* builder) SK_OVERRIDE;
virtual void emitVS(GrGLShaderBuilder* state,
- const char* vertexCoords) SK_OVERRIDE;
+ const char* vertexCoords) SK_OVERRIDE {};
virtual void emitFS(GrGLShaderBuilder* state,
const char* outputColor,
const char* inputColor,
}
void GrGLMorphologyEffect::setupVariables(GrGLShaderBuilder* builder) {
- fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType |
- GrGLShaderBuilder::kVertex_ShaderType,
+ fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
kVec2f_GrSLType, "ImageIncrement");
}
-void GrGLMorphologyEffect::emitVS(GrGLShaderBuilder* builder,
- const char* vertexCoords) {
- SkString* code = &builder->fVSCode;
- const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
- code->appendf("\t\t%s -= vec2(%d, %d) * %s;\n", vertexCoords, fRadius, fRadius, imgInc);
-}
-
void GrGLMorphologyEffect ::emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
}
const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
- code->appendf("\t\tvec2 coord = %s;\n", builder->fSampleCoords.c_str());
+ code->appendf("\t\tvec2 coord = %s - %d * %s;\n",
+ builder->fSampleCoords.c_str(), fRadius, imgInc);
code->appendf("\t\tfor (int i = 0; i < %d; i++) {\n", this->width());
code->appendf("\t\t\tvalue = %s(value, ", func);
builder->emitTextureLookup(samplerName, "coord");
this->direction() == s.direction() &&
this->type() == s.type());
}
+
+///////////////////////////////////////////////////////////////////////////////
+
+GR_DEFINE_CUSTOM_STAGE_TEST(GrMorphologyEffect);
+
+GrCustomStage* GrMorphologyEffect::TestCreate(SkRandom* random,
+ GrContext* context,
+ GrTexture* textures[]) {
+ int texIdx = random->nextBool() ? GrCustomStageTestFactory::kSkiaPMTextureIdx :
+ GrCustomStageTestFactory::kAlphaTextureIdx;
+ Direction dir = random->nextBool() ? kX_Direction : kY_Direction;
+ static const int kMaxRadius = 10;
+ int radius = random->nextRangeU(1, kMaxRadius);
+ MorphologyType type = random->nextBool() ? GrContext::kErode_MorphologyType :
+ GrContext::kDilate_MorphologyType;
+
+ return SkNEW_ARGS(GrMorphologyEffect, (textures[texIdx], dir, radius, type));
+}
MorphologyType fType;
private:
+ GR_DECLARE_CUSTOM_STAGE_TEST;
typedef Gr1DKernelEffect INHERITED;
};
const GrProgramStageFactory& GrSingleTextureEffect::getFactory() const {
return GrTProgramStageFactory<GrSingleTextureEffect>::getInstance();
}
+
+///////////////////////////////////////////////////////////////////////////////
+
+GR_DEFINE_CUSTOM_STAGE_TEST(GrSingleTextureEffect);
+
+GrCustomStage* GrSingleTextureEffect::TestCreate(SkRandom* random,
+ GrContext* context,
+ GrTexture* textures[]) {
+ int texIdx = random->nextBool() ? GrCustomStageTestFactory::kSkiaPMTextureIdx :
+ GrCustomStageTestFactory::kAlphaTextureIdx;
+ return SkNEW_ARGS(GrSingleTextureEffect, (textures[texIdx]));
+}
virtual const GrProgramStageFactory& getFactory() const SK_OVERRIDE;
private:
+ GR_DECLARE_CUSTOM_STAGE_TEST;
+
GrTexture* fTexture;
typedef GrCustomStage INHERITED;
const GrTextureDomainEffect& s = static_cast<const GrTextureDomainEffect&>(sBase);
return (INHERITED::isEqual(sBase) && this->fTextureDomain == s.fTextureDomain);
}
+
+///////////////////////////////////////////////////////////////////////////////
+
+GR_DEFINE_CUSTOM_STAGE_TEST(GrTextureDomainEffect);
+
+GrCustomStage* GrTextureDomainEffect::TestCreate(SkRandom* random,
+ GrContext* context,
+ GrTexture* textures[]) {
+ int texIdx = random->nextBool() ? GrCustomStageTestFactory::kSkiaPMTextureIdx :
+ GrCustomStageTestFactory::kAlphaTextureIdx;
+ GrRect domain;
+ domain.fLeft = random->nextUScalar1();
+ domain.fRight = random->nextRangeScalar(domain.fLeft, SK_Scalar1);
+ domain.fTop = random->nextUScalar1();
+ domain.fBottom = random->nextRangeScalar(domain.fTop, SK_Scalar1);
+ return SkNEW_ARGS(GrTextureDomainEffect, (textures[texIdx], domain));
+}
GrRect fTextureDomain;
private:
+ GR_DECLARE_CUSTOM_STAGE_TEST;
typedef GrSingleTextureEffect INHERITED;
};
#if SK_SUPPORT_GPU && SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
#include "gl/GrGpuGL.h"
-#include "effects/GrColorTableEffect.h"
-#include "effects/GrConvolutionEffect.h"
-#include "effects/GrMorphologyEffect.h"
#include "SkLightingImageFilter.h"
#include "GrProgramStageFactory.h"
#include "GrRandom.h"
GrContext* context,
GrTexture* dummyTextures[]) {
enum EffectType {
- kConvolution_EffectType,
- kErode_EffectType,
- kDilate_EffectType,
/**
* Lighting effects don't work in unit test because they assume they insert functions and
* assume the names are unique. This breaks when there are two light effects in the same
kSpecularSpot_EffectType,
*/
- kColorTable_EffectType,
-
kEffectCount
};
StageDesc::kMulRGBByAlpha_RoundUp_InConfigFlag |
StageDesc::kMulRGBByAlpha_RoundDown_InConfigFlag;
- static const Gr1DKernelEffect::Direction gKernelDirections[] = {
- Gr1DKernelEffect::kX_Direction,
- Gr1DKernelEffect::kY_Direction
- };
-
// The new code uses SkRandom not GrRandom.
// TODO: Remove GrRandom.
SkRandom sk_random;
// TODO: When matrices are property of the custom-stage then remove the
// no-persp flag code below.
int effect = random_int(random, kEffectCount);
- switch (effect) {
- case kConvolution_EffectType: {
- int direction = random_int(random, 2);
- int kernelRadius = random_int(random, 1, 4);
- float kernel[GrConvolutionEffect::kMaxKernelWidth];
- for (int i = 0; i < GrConvolutionEffect::kMaxKernelWidth; i++) {
- kernel[i] = random->nextF();
- }
- // does not work with perspective or mul-by-alpha-mask
- stageDesc->fOptFlags |= StageDesc::kNoPerspective_OptFlagBit;
- stageDesc->fInConfigFlags &= ~kMulByAlphaMask;
- return SkNEW_ARGS(GrConvolutionEffect,
- (NULL,
- gKernelDirections[direction],
- kernelRadius,
- kernel));
- }
- case kErode_EffectType: {
- int direction = random_int(random, 2);
- int kernelRadius = random_int(random, 1, 4);
- // does not work with perspective or mul-by-alpha-mask
- stageDesc->fOptFlags |= StageDesc::kNoPerspective_OptFlagBit;
- stageDesc->fInConfigFlags &= ~kMulByAlphaMask;
- return SkNEW_ARGS(GrMorphologyEffect,
- (NULL,
- gKernelDirections[direction],
- kernelRadius,
- GrContext::kErode_MorphologyType));
- }
- case kDilate_EffectType: {
- int direction = random_int(random, 2);
- int kernelRadius = random_int(random, 1, 4);
- // does not work with perspective or mul-by-alpha-mask
- stageDesc->fOptFlags |= StageDesc::kNoPerspective_OptFlagBit;
- stageDesc->fInConfigFlags &= ~kMulByAlphaMask;
- return SkNEW_ARGS(GrMorphologyEffect,
- (NULL,
- gKernelDirections[direction],
- kernelRadius,
- GrContext::kDilate_MorphologyType));
- }
- /*
+/* switch (effect) {
case kDiffuseDistant_EffectType: {
SkPoint3 direction = random_point3(random);
direction.normalize();
SkASSERT(ok);
return stage;
}
- */
- case kColorTable_EffectType: {
- GrTexture* alphaTexture = dummyTextures[GrCustomStageTestFactory::kAlphaTextureIdx];
- return SkNEW_ARGS(GrColorTableEffect, (alphaTexture));
- }
default:
GrCrash("Unexpected custom effect type");
}
+ */
return NULL;
}
}