GLProgramsTest.cpp revision ec56e4545477e30d4f165ca55ed99f90525c6c38
1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang * Copyright 2011 Google Inc. 405436638acc7c010349a69c3395f1a57c642dc62Ying Wang * 5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project * Use of this source code is governed by a BSD-style license that can be 6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project * found in the LICENSE file. 7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project */ 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 905436638acc7c010349a69c3395f1a57c642dc62Ying Wang// This is a GPU-backend specific test. It relies on static intializers to work 1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "SkTypes.h" 12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if SK_SUPPORT_GPU && SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "GrBackendEffectFactory.h" 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "GrContextFactory.h" 17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "GrDrawEffect.h" 18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "effects/GrConfigConversionEffect.h" 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "gl/GrGLPathRendering.h" 20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "gl/GrGpuGL.h" 21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "SkChecksum.h" 22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "SkRandom.h" 2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "Test.h" 24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool GrGLProgramDesc::setRandom(SkRandom* random, 2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang const GrGpuGL* gpu, 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang const GrRenderTarget* dstRenderTarget, 28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project const GrTexture* dstCopyTexture, 29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project const GrEffectStage* stages[], 30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int numColorStages, 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int numCoverageStages, 32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int currAttribIndex) { 33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bool useLocalCoords = random->nextBool() && currAttribIndex < GrDrawState::kMaxVertexAttribCnt; 34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int numStages = numColorStages + numCoverageStages; 36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fKey.reset(); 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GR_STATIC_ASSERT(0 == kEffectKeyOffsetsAndLengthOffset % sizeof(uint32_t)); 39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project // Make room for everything up to and including the array of offsets to effect keys. 41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fKey.push_back_n(kEffectKeyOffsetsAndLengthOffset + 2 * sizeof(uint16_t) * numStages); 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool dstRead = false; 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool fragPos = false; 45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bool vertexShader = false; 46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (int s = 0; s < numStages; ++s) { 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project uint16_t* offsetAndSize = reinterpret_cast<uint16_t*>(fKey.begin() + 4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang kEffectKeyOffsetsAndLengthOffset + 4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang s * 2 * sizeof(uint16_t)); 50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project uint32_t effectKeyOffset = fKey.count(); 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (effectKeyOffset > SK_MaxU16) { 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang fKey.reset(); 53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return false; 54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang GrDrawEffect drawEffect(*stages[s], useLocalCoords); 56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GrEffectKeyBuilder b(&fKey); 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project uint16_t effectKeySize; 58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (!GetEffectKeyAndUpdateStats(*stages[s], gpu->glCaps(), useLocalCoords, &b, 59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project &effectKeySize, &dstRead, &fragPos, &vertexShader)) { 60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project fKey.reset(); 61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return false; 62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project offsetAndSize[0] = effectKeyOffset; 64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project offsetAndSize[1] = effectKeySize; 65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project KeyHeader* header = this->header(); 68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project memset(header, 0, kHeaderSize); 6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fEmitsPointSize = random->nextBool(); 7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fPositionAttributeIndex = 0; 7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang // if the effects have used up all off the available attributes, 7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang // don't try to use color or coverage attributes as input 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang do { 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang uint32_t colorRand = random->nextULessThan(2); 7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fColorInput = (0 == colorRand) ? GrGLProgramDesc::kAttribute_ColorInput : 78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GrGLProgramDesc::kUniform_ColorInput; 7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex && 80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project kAttribute_ColorInput == header->fColorInput); 8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fColorAttributeIndex = (header->fColorInput == kAttribute_ColorInput) ? 83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project currAttribIndex++ : 84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project -1; 8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang do { 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fCoverageInput = static_cast<GrGLProgramDesc::ColorInput>( 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang random->nextULessThan(kColorInputCnt)); 8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex && 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang kAttribute_ColorInput == header->fCoverageInput); 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fCoverageAttributeIndex = (header->fCoverageInput == kAttribute_ColorInput) ? 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang currAttribIndex++ : 9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang -1; 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if GR_GL_EXPERIMENTAL_GS 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fExperimentalGS = gpu->caps()->geometryShaderSupport() && random->nextBool(); 9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fLocalCoordAttributeIndex = useLocalCoords ? currAttribIndex++ : -1; 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fColorEffectCnt = numColorStages; 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fCoverageEffectCnt = numCoverageStages; 10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (dstRead) { 10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fDstReadKey = SkToU8(GrGLFragmentShaderBuilder::KeyForDstRead(dstCopyTexture, 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang gpu->glCaps())); 10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang } else { 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fDstReadKey = 0; 10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (fragPos) { 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fFragPosKey = SkToU8(GrGLFragmentShaderBuilder::KeyForFragmentPosition(dstRenderTarget, 11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang gpu->glCaps())); 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } else { 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fFragPosKey = 0; 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fRequiresVertexShader = vertexShader || 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang useLocalCoords || 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang kAttribute_ColorInput == header->fColorInput || 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang kAttribute_ColorInput == header->fCoverageInput; 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang CoverageOutput coverageOutput; 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang bool illegalCoverageOutput; 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang do { 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang coverageOutput = static_cast<CoverageOutput>(random->nextULessThan(kCoverageOutputCnt)); 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang illegalCoverageOutput = (!gpu->caps()->dualSourceBlendingSupport() && 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang CoverageOutputUsesSecondaryOutput(coverageOutput)) || 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang (!dstRead && kCombineWithDst_CoverageOutput == coverageOutput); 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } while (illegalCoverageOutput); 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang header->fCoverageOutput = coverageOutput; 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang this->finalize(); 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang return true; 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13705436638acc7c010349a69c3395f1a57c642dc62Ying Wangbool GrGpuGL::programUnitTest(int maxStages) { 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang GrTextureDesc dummyDesc; 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang dummyDesc.fFlags = kRenderTarget_GrTextureFlagBit; 14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang dummyDesc.fConfig = kSkia8888_GrPixelConfig; 14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang dummyDesc.fWidth = 34; 14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang dummyDesc.fHeight = 18; 14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang SkAutoTUnref<GrTexture> dummyTexture1(this->createTexture(dummyDesc, NULL, 0)); 14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang dummyDesc.fFlags = kNone_GrTextureFlags; 14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang dummyDesc.fConfig = kAlpha_8_GrPixelConfig; 14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang dummyDesc.fWidth = 16; 14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang dummyDesc.fHeight = 22; 14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang SkAutoTUnref<GrTexture> dummyTexture2(this->createTexture(dummyDesc, NULL, 0)); 15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!dummyTexture1 || ! dummyTexture2) { 15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang return false; 15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang static const int NUM_TESTS = 512; 15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang SkRandom random; 15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (int t = 0; t < NUM_TESTS; ++t) { 15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if 0 16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang GrPrintf("\nTest Program %d\n-------------\n", t); 16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang static const int stop = -1; 16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (t == stop) { 16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang int breakpointhere = 9; 16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang GrGLProgramDesc pdesc; 16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang int currAttribIndex = 1; // we need to always leave room for position 17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang int currTextureCoordSet = 0; 17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang int attribIndices[2] = { 0, 0 }; 17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang GrTexture* dummyTextures[] = {dummyTexture1.get(), dummyTexture2.get()}; 17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang int numStages = random.nextULessThan(maxStages + 1); 17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang int numColorStages = random.nextULessThan(numStages + 1); 17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang int numCoverageStages = numStages - numColorStages; 178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project SkAutoSTMalloc<8, const GrEffectStage*> stages(numStages); 180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project bool useFixedFunctionPathRendering = this->glCaps().pathRenderingSupport() && 182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project this->glPathRendering()->texturingMode() == GrGLPathRendering::FixedFunction_TexturingMode; 183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (int s = 0; s < numStages;) { 185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project SkAutoTUnref<const GrEffect> effect(GrEffectTestFactory::CreateStage( 186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project &random, 187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project this->getContext(), 18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang *this->caps(), 189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project dummyTextures)); 190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project SkASSERT(effect); 19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang int numAttribs = effect->numVertexAttribs(); 192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang // If adding this effect would exceed the max attrib count then generate a 194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project // new random effect. 195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (currAttribIndex + numAttribs > GrDrawState::kMaxVertexAttribCnt) { 19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang continue; 197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project // If adding this effect would exceed the max texture coord set count then generate a 20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang // new random effect. 202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (useFixedFunctionPathRendering && !effect->requiresVertexShader()) { 203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int numTransforms = effect->numTransforms(); 204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (currTextureCoordSet + numTransforms > this->glCaps().maxFixedFunctionTextureCoords()) { 205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project continue; 206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project currTextureCoordSet += numTransforms; 208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project useFixedFunctionPathRendering = useFixedFunctionPathRendering && !effect->requiresVertexShader(); 211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for (int i = 0; i < numAttribs; ++i) { 213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project attribIndices[i] = currAttribIndex++; 214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GrEffectStage* stage = SkNEW_ARGS(GrEffectStage, 21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang (effect.get(), attribIndices[0], attribIndices[1])); 217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project stages[s] = stage; 218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project ++s; 219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project const GrTexture* dstTexture = random.nextBool() ? dummyTextures[0] : dummyTextures[1]; 22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (!pdesc.setRandom(&random, 222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project this, 223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project dummyTextures[0]->asRenderTarget(), 224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project dstTexture, 225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project stages.get(), 226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project numColorStages, 227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project numCoverageStages, 22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang currAttribIndex)) { 22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang return false; 23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang SkAutoTUnref<GrGLProgram> program(GrGLProgram::Create(this, 233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project pdesc, 234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project stages, 235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project stages + numColorStages)); 23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (int s = 0; s < numStages; ++s) { 23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang SkDELETE(stages[s]); 23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (NULL == program.get()) { 24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang return false; 24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang return true; 244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectDEF_GPUTEST(GLPrograms, reporter, factory) { 24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) { 248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GrContext* context = factory->get(static_cast<GrContextFactory::GLContextType>(type)); 24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (NULL != context) { 25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang GrGpuGL* gpu = static_cast<GrGpuGL*>(context->getGpu()); 25105436638acc7c010349a69c3395f1a57c642dc62Ying Wang int maxStages = 6; 25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if SK_ANGLE 25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang // Some long shaders run out of temporary registers in the D3D compiler on ANGLE. 25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (type == GrContextFactory::kANGLE_GLContextType) { 25505436638acc7c010349a69c3395f1a57c642dc62Ying Wang maxStages = 3; 25605436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project REPORTER_ASSERT(reporter, gpu->programUnitTest(maxStages)); 25905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 26305436638acc7c010349a69c3395f1a57c642dc62Ying Wang// This is evil evil evil. The linker may throw away whole translation units as dead code if it 26405436638acc7c010349a69c3395f1a57c642dc62Ying Wang// thinks none of the functions are called. It will do this even if there are static initializers 26505436638acc7c010349a69c3395f1a57c642dc62Ying Wang// in the unit that could pass pointers to functions from the unit out to other translation units! 266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// We force some of the effects that would otherwise be discarded to link here. 26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "SkAlphaThresholdFilter.h" 26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "SkColorMatrixFilter.h" 27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "SkLightingImageFilter.h" 27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "SkMagnifierImageFilter.h" 27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 27305436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid forceLinking(); 27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 27505436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid forceLinking() { 27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang SkLightingImageFilter::CreateDistantLitDiffuse(SkPoint3(0,0,0), 0, 0, 0); 27705436638acc7c010349a69c3395f1a57c642dc62Ying Wang SkAlphaThresholdFilter::Create(SkRegion(), .5f, .5f); 27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang SkAutoTUnref<SkImageFilter> mag(SkMagnifierImageFilter::Create( 279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project SkRect::MakeWH(SK_Scalar1, SK_Scalar1), SK_Scalar1)); 28005436638acc7c010349a69c3395f1a57c642dc62Ying Wang GrConfigConversionEffect::Create(NULL, 281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project false, 282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GrConfigConversionEffect::kNone_PMConversion, 283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project SkMatrix::I()); 284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project SkScalar matrix[20]; 285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project SkAutoTUnref<SkColorMatrixFilter> cmf(SkColorMatrixFilter::Create(matrix)); 286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project