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