1b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt/* 2b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * Copyright 2012 Google Inc. 3b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * 4b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * Use of this source code is governed by a BSD-style license that can be 5b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * found in the LICENSE file. 6b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt */ 7b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 8b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#ifndef GrProcessorUnitTest_DEFINED 9b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GrProcessorUnitTest_DEFINED 10b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 11b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "SkRandom.h" 12b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "SkTArray.h" 13b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#include "SkTypes.h" 14b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 15b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass SkMatrix; 16b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrDrawTargetCaps; 17b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 18b0a8a377f832c59cee939ad721e1f87d378b7142joshualittnamespace GrProcessorUnitTest { 19b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt// Used to access the dummy textures in TestCreate procs. 20b0a8a377f832c59cee939ad721e1f87d378b7142joshualittenum { 21b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt kSkiaPMTextureIdx = 0, 22b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt kAlphaTextureIdx = 1, 23b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt}; 24b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 25b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt/** 26b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * A helper for use in GrProcessor::TestCreate functions. 27b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt */ 28b0a8a377f832c59cee939ad721e1f87d378b7142joshualittconst SkMatrix& TestMatrix(SkRandom*); 29b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 30b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt} 31b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 32b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 33b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 34b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrContext; 35b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrProcessor; 36b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrTexture; 37b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 38b0a8a377f832c59cee939ad721e1f87d378b7142joshualitttemplate <class Processor> 39b0a8a377f832c59cee939ad721e1f87d378b7142joshualittclass GrProcessorTestFactory : SkNoncopyable { 40b0a8a377f832c59cee939ad721e1f87d378b7142joshualittpublic: 41b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 42b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt typedef Processor* (*CreateProc)(SkRandom*, 43b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext*, 44b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps& caps, 45b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture* dummyTextures[]); 46b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 47b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorTestFactory(CreateProc createProc) { 48b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt fCreateProc = createProc; 49b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GetFactories()->push_back(this); 50b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt } 51b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 52b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static Processor* CreateStage(SkRandom* random, 53b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext* context, 54b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps& caps, 55b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture* dummyTextures[]) { 56b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt uint32_t idx = random->nextRangeU(0, GetFactories()->count() - 1); 57b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorTestFactory<Processor>* factory = (*GetFactories())[idx]; 58b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt return factory->fCreateProc(random, context, caps, dummyTextures); 59b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt } 60b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 61b0a8a377f832c59cee939ad721e1f87d378b7142joshualittprivate: 62b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt CreateProc fCreateProc; 63b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 64b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 65b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static SkTArray<GrProcessorTestFactory<Processor>*, true>* GetFactories() { 66b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static SkTArray<GrProcessorTestFactory<Processor>*, true> gFactories; 67b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt return &gFactories; 68b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt } 69b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt #endif 70b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt}; 71b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 72b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt/** GrProcessor subclasses should insert this macro in their declaration to be included in the 73b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * program generation unit test. 74b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt */ 75b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 76b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DECLARE_GEOMETRY_PROCESSOR_TEST \ 77b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static GrProcessorTestFactory<GrGeometryProcessor> gTestFactory; \ 78b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static GrGeometryProcessor* TestCreate(SkRandom*, \ 79b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext*, \ 80b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps&, \ 81b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture* dummyTextures[2]) 82b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 83b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DECLARE_FRAGMENT_PROCESSOR_TEST \ 84b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static GrProcessorTestFactory<GrFragmentProcessor> gTestFactory; \ 85b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static GrFragmentProcessor* TestCreate(SkRandom*, \ 86b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext*, \ 87b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps&, \ 88b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture* dummyTextures[2]) 89b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 90b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt/** GrProcessor subclasses should insert this macro in their implementation file. They must then 91b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * also implement this static function: 92b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * GrProcessor* TestCreate(SkRandom*, 93b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * GrContext*, 94b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * const GrDrawTargetCaps&, 95b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * GrTexture* dummyTextures[2]); 96b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * dummyTextures[] are valid textures that can optionally be used to construct GrTextureAccesses. 97b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * The first texture has config kSkia8888_GrPixelConfig and the second has 98b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * kAlpha_8_GrPixelConfig. TestCreate functions are also free to create additional textures using 99b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt * the GrContext. 100b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt */ 101b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Effect) \ 102b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorTestFactory<GrFragmentProcessor> Effect :: gTestFactory(Effect :: TestCreate) 103b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 104b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(Effect) \ 105b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrProcessorTestFactory<GrGeometryProcessor> Effect :: gTestFactory(Effect :: TestCreate) 106b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 107b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#else // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 108b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 109b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt// The unit test relies on static initializers. Just declare the TestCreate function so that 110b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt// its definitions will compile. 111b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DECLARE_FRAGMENT_PROCESSOR_TEST \ 112b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static GrFragmentProcessor* TestCreate(SkRandom*, \ 113b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext*, \ 114b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps&, \ 115b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture* dummyTextures[2]) 116b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DEFINE_FRAGMENT_PROCESSOR_TEST(X) 117b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 118b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt// The unit test relies on static initializers. Just declare the TestCreate function so that 119b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt// its definitions will compile. 120b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DECLARE_GEOMETRY_PROCESSOR_TEST \ 121b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt static GrGeometryProcessor* TestCreate(SkRandom*, \ 122b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrContext*, \ 123b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt const GrDrawTargetCaps&, \ 124b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt GrTexture* dummyTextures[2]) 125b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(X) 126b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt 127b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#endif // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 128b0a8a377f832c59cee939ad721e1f87d378b7142joshualitt#endif 129