GLProgramsTest.cpp revision 8e919add406c5d20918a7f0ca811317312e6ce67
1a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com
2a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com/*
3a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com * Copyright 2011 Google Inc.
4a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com *
5a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
6a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com * found in the LICENSE file.
7a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com */
8a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com
9d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com// This is a GPU-backend specific test. It relies on static intializers to work
10cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com
112a48c3adb7cf4fc754f99a41352210b4a99edf04bsalomon@google.com#include "SkTypes.h"
122a48c3adb7cf4fc754f99a41352210b4a99edf04bsalomon@google.com
132a48c3adb7cf4fc754f99a41352210b4a99edf04bsalomon@google.com#if SK_SUPPORT_GPU && SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
142a48c3adb7cf4fc754f99a41352210b4a99edf04bsalomon@google.com
155739d2c168819394502e20cbe6071979b9c1038cbsalomon@google.com#include "gl/GrGpuGL.h"
16396e61fe440590744345e0c56970b26ab464591dbsalomon@google.com#include "GrBackendEffectFactory.h"
1767b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com#include "GrContextFactory.h"
18c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com#include "GrDrawEffect.h"
19a04e8e842450e606dd938ddae17857849bd504d4bsalomon@google.com#include "effects/GrConfigConversionEffect.h"
20a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com
212db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com#include "SkChecksum.h"
22223137f49d1a4e805f5c1b1c20b7fd68719ac54btfarina@chromium.org#include "SkRandom.h"
23c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com#include "Test.h"
24c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com
25e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgvoid GrGLProgramDesc::setRandom(SkRandom* random,
2631ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com                                const GrGpuGL* gpu,
272db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                const GrRenderTarget* dstRenderTarget,
282db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                const GrTexture* dstCopyTexture,
292db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                const GrEffectStage* stages[],
302db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                int numColorStages,
312db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                int numCoverageStages,
32054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com                                int currAttribIndex) {
332db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    int numEffects = numColorStages + numCoverageStages;
342db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    size_t keyLength = KeyLength(numEffects);
352db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    fKey.reset(keyLength);
362db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    *this->atOffset<uint32_t, kLengthOffset>() = static_cast<uint32_t>(keyLength);
372db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    memset(this->header(), 0, kHeaderSize);
38054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com
392db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    KeyHeader* header = this->header();
402db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    header->fEmitsPointSize = random->nextBool();
412db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com
422db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    header->fPositionAttributeIndex = 0;
43054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com
4405a2ee052c9ef4c781b7b590b00b3d2da3b3449askia.committer@gmail.com    // if the effects have used up all off the available attributes,
45054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com    // don't try to use color or coverage attributes as input
46054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com    do {
47949eef0af2f5b47000e637347801cf2970092a38commit-bot@chromium.org        header->fColorInput = static_cast<GrGLProgramDesc::ColorInput>(
48949eef0af2f5b47000e637347801cf2970092a38commit-bot@chromium.org                                  random->nextULessThan(kColorInputCnt));
4905a2ee052c9ef4c781b7b590b00b3d2da3b3449askia.committer@gmail.com    } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex &&
502db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com             kAttribute_ColorInput == header->fColorInput);
512db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    header->fColorAttributeIndex = (header->fColorInput == kAttribute_ColorInput) ?
522db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                        currAttribIndex++ :
532db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                        -1;
54054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com
55054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com    do {
56949eef0af2f5b47000e637347801cf2970092a38commit-bot@chromium.org        header->fCoverageInput = static_cast<GrGLProgramDesc::ColorInput>(
57949eef0af2f5b47000e637347801cf2970092a38commit-bot@chromium.org                                     random->nextULessThan(kColorInputCnt));
58054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com    } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex  &&
592db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com             kAttribute_ColorInput == header->fCoverageInput);
602db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    header->fCoverageAttributeIndex = (header->fCoverageInput == kAttribute_ColorInput) ?
612db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                        currAttribIndex++ :
622db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                        -1;
6391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
64949eef0af2f5b47000e637347801cf2970092a38commit-bot@chromium.org    header->fColorFilterXfermode = static_cast<SkXfermode::Mode>(
65949eef0af2f5b47000e637347801cf2970092a38commit-bot@chromium.org                                       random->nextULessThan(SkXfermode::kLastCoeffMode + 1));
6691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
6791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com#if GR_GL_EXPERIMENTAL_GS
682db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    header->fExperimentalGS = gpu->caps()->geometryShaderSupport() && random->nextBool();
6991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com#endif
7091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
712db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    header->fDiscardIfZeroCoverage = random->nextBool();
7237cbc7fd014e3b35833523dbdbe3bc3ac52ecacdskia.committer@gmail.com
73054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com    bool useLocalCoords = random->nextBool() && currAttribIndex < GrDrawState::kMaxVertexAttribCnt;
742db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    header->fLocalCoordAttributeIndex = useLocalCoords ? currAttribIndex++ : -1;
752db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com
762db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    header->fColorEffectCnt = numColorStages;
772db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    header->fCoverageEffectCnt = numCoverageStages;
78c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com
79b79d865f03456b67273b568fa5046b8ba01e365absalomon@google.com    bool dstRead = false;
802db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    bool fragPos = false;
816b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org    bool vertexCode = false;
822db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    int numStages = numColorStages + numCoverageStages;
832db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    for (int s = 0; s < numStages; ++s) {
842db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        const GrBackendEffectFactory& factory = (*stages[s]->getEffect())->getFactory();
852db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        GrDrawEffect drawEffect(*stages[s], useLocalCoords);
862db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        this->effectKeys()[s] = factory.glEffectKey(drawEffect, gpu->glCaps());
872db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        if ((*stages[s]->getEffect())->willReadDstColor()) {
882db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com            dstRead = true;
892db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        }
902db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        if ((*stages[s]->getEffect())->willReadFragmentPosition()) {
912db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com            fragPos = true;
9291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com        }
936b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org        if ((*stages[s]->getEffect())->hasVertexCode()) {
946b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org            vertexCode = true;
956b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org        }
9691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com    }
979b855c7c95ce9fff7a447e4a6bdf8a469c1f3097jvanverth@google.com
98b79d865f03456b67273b568fa5046b8ba01e365absalomon@google.com    if (dstRead) {
992db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        header->fDstReadKey = GrGLShaderBuilder::KeyForDstRead(dstCopyTexture, gpu->glCaps());
1002db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    } else {
1012db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        header->fDstReadKey = 0;
1022db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    }
1032db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    if (fragPos) {
1042db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        header->fFragPosKey = GrGLShaderBuilder::KeyForFragmentPosition(dstRenderTarget,
1052db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                                                         gpu->glCaps());
1062db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    } else {
1072db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        header->fFragPosKey = 0;
108b79d865f03456b67273b568fa5046b8ba01e365absalomon@google.com    }
1095920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com
1106b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org    header->fHasVertexCode = vertexCode ||
1116b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org                             useLocalCoords ||
1126b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org                             kAttribute_ColorInput == header->fColorInput ||
1136b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org                             kAttribute_ColorInput == header->fCoverageInput;
1146b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org
1155920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com    CoverageOutput coverageOutput;
1165920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com    bool illegalCoverageOutput;
1175920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com    do {
1185920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com        coverageOutput = static_cast<CoverageOutput>(random->nextULessThan(kCoverageOutputCnt));
1195920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com        illegalCoverageOutput = (!gpu->caps()->dualSourceBlendingSupport() &&
1205920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com                                 CoverageOutputUsesSecondaryOutput(coverageOutput)) ||
12172993ab54276f8202d49b1e132e01c2a584d1dbebsalomon@google.com                                (!dstRead && kCombineWithDst_CoverageOutput == coverageOutput);
1225920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com    } while (illegalCoverageOutput);
1235920ac276877b36624e07baf97c7768e80a07f98bsalomon@google.com
1242db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    header->fCoverageOutput = coverageOutput;
1252db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com
1262db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    *this->checksum() = 0;
1272db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    *this->checksum() = SkChecksum::Compute(reinterpret_cast<uint32_t*>(fKey.get()), keyLength);
1282db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    fInitialized = true;
12991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com}
13091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com
131042a2861b2aa7a7a9fff12503a4b297d6ee1d335bsalomon@google.combool GrGpuGL::programUnitTest(int maxStages) {
132042a2861b2aa7a7a9fff12503a4b297d6ee1d335bsalomon@google.com
133d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    GrTextureDesc dummyDesc;
1342db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    dummyDesc.fFlags = kRenderTarget_GrTextureFlagBit;
135fec0bc3fc13481f5bcb341ab2d2d695911f39bd4bsalomon@google.com    dummyDesc.fConfig = kSkia8888_GrPixelConfig;
136d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    dummyDesc.fWidth = 34;
137d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    dummyDesc.fHeight = 18;
138d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    SkAutoTUnref<GrTexture> dummyTexture1(this->createTexture(dummyDesc, NULL, 0));
1392db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com    dummyDesc.fFlags = kNone_GrTextureFlags;
140d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    dummyDesc.fConfig = kAlpha_8_GrPixelConfig;
141d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    dummyDesc.fWidth = 16;
142d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    dummyDesc.fHeight = 22;
143d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com    SkAutoTUnref<GrTexture> dummyTexture2(this->createTexture(dummyDesc, NULL, 0));
144d472620458e2383e6dd949f4e1aaf61160717ffebsalomon@google.com
145c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com    static const int NUM_TESTS = 512;
146c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com
147e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom random;
148c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com    for (int t = 0; t < NUM_TESTS; ++t) {
149c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com
150c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com#if 0
151c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com        GrPrintf("\nTest Program %d\n-------------\n", t);
152c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com        static const int stop = -1;
153c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com        if (t == stop) {
154c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com            int breakpointhere = 9;
155c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com        }
156c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com#endif
157c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com
15831ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com        GrGLProgramDesc pdesc;
159c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com
160054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com        int currAttribIndex = 1;  // we need to always leave room for position
1618e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org        int currTextureCoordSet = 0;
162ff6ea2663f76aa85ec55ddd0f00ca7906f1bc4e3commit-bot@chromium.org        int attribIndices[2];
163b79d865f03456b67273b568fa5046b8ba01e365absalomon@google.com        GrTexture* dummyTextures[] = {dummyTexture1.get(), dummyTexture2.get()};
1642db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com
1652db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        int numStages = random.nextULessThan(maxStages + 1);
1662db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        int numColorStages = random.nextULessThan(numStages + 1);
1672db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        int numCoverageStages = numStages - numColorStages;
1682db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com
1692db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        SkAutoSTMalloc<8, const GrEffectStage*> stages(numStages);
1702db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com
1718e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org        bool useFixedFunctionTexturing = this->shouldUseFixedFunctionTexturing();
1728e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org
1738e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org        for (int s = 0; s < numStages;) {
1742db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com            SkAutoTUnref<const GrEffectRef> effect(GrEffectTestFactory::CreateStage(
1752db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                                                            &random,
1762db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                                                            this->getContext(),
1772db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                                                            *this->caps(),
1782db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                                                                            dummyTextures));
1792db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com            int numAttribs = (*effect)->numVertexAttribs();
1802db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com
1812db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com            // If adding this effect would exceed the max attrib count then generate a
1822db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com            // new random effect.
1832db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com            if (currAttribIndex + numAttribs > GrDrawState::kMaxVertexAttribCnt) {
1842db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                continue;
1852db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com            }
1868e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org
1878e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org
1888e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org            // If adding this effect would exceed the max texture coord set count then generate a
1898e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org            // new random effect.
1908e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org            if (useFixedFunctionTexturing && !(*effect)->hasVertexCode()) {
1918e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org                int numTransforms = (*effect)->numTransforms();
1928e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org                if (currTextureCoordSet + numTransforms > this->glCaps().maxFixedFunctionTextureCoords()) {
1938e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org                    continue;
1948e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org                }
1958e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org                currTextureCoordSet += numTransforms;
1968e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org            }
1978e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org
1988e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org            useFixedFunctionTexturing = useFixedFunctionTexturing && !(*effect)->hasVertexCode();
1998e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org
2002db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com            for (int i = 0; i < numAttribs; ++i) {
2012db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                attribIndices[i] = currAttribIndex++;
202c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com            }
2032d3b49201302f3f82e405a750724eae8ef82e5a0commit-bot@chromium.org            GrEffectStage* stage = SkNEW_ARGS(GrEffectStage,
2042d3b49201302f3f82e405a750724eae8ef82e5a0commit-bot@chromium.org                                              (effect.get(), attribIndices[0], attribIndices[1]));
2052db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com            stages[s] = stage;
2068e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org            ++s;
207c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com        }
208b79d865f03456b67273b568fa5046b8ba01e365absalomon@google.com        const GrTexture* dstTexture = random.nextBool() ? dummyTextures[0] : dummyTextures[1];
2092db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        pdesc.setRandom(&random,
2102db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                        this,
2112db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                        dummyTextures[0]->asRenderTarget(),
2122db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                        dstTexture,
2132db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                        stages.get(),
2142db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                        numColorStages,
2152db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                        numCoverageStages,
2162db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com                        currAttribIndex);
21705a2ee052c9ef4c781b7b590b00b3d2da3b3449askia.committer@gmail.com
2189188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org        SkAutoTUnref<GrGLProgram> program(GrGLProgram::Create(this,
219c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com                                                              pdesc,
2202c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                                                              stages,
2212c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com                                                              stages + numColorStages));
2222db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com        for (int s = 0; s < numStages; ++s) {
223504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com            SkDELETE(stages[s]);
224504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com        }
225c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com        if (NULL == program.get()) {
226c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com            return false;
227c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com        }
228c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com    }
229c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com    return true;
230c3841b927ba32237a540949c408f78ad7682aa60bsalomon@google.com}
231a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com
23267b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.comstatic void GLProgramsTest(skiatest::Reporter* reporter, GrContextFactory* factory) {
23367b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com    for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) {
23467b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com        GrContext* context = factory->get(static_cast<GrContextFactory::GLContextType>(type));
23567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com        if (NULL != context) {
236042a2861b2aa7a7a9fff12503a4b297d6ee1d335bsalomon@google.com            GrGpuGL* gpu = static_cast<GrGpuGL*>(context->getGpu());
237eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com            int maxStages = 6;
238042a2861b2aa7a7a9fff12503a4b297d6ee1d335bsalomon@google.com#if SK_ANGLE
239042a2861b2aa7a7a9fff12503a4b297d6ee1d335bsalomon@google.com            // Some long shaders run out of temporary registers in the D3D compiler on ANGLE.
240042a2861b2aa7a7a9fff12503a4b297d6ee1d335bsalomon@google.com            if (type == GrContextFactory::kANGLE_GLContextType) {
241042a2861b2aa7a7a9fff12503a4b297d6ee1d335bsalomon@google.com                maxStages = 3;
242042a2861b2aa7a7a9fff12503a4b297d6ee1d335bsalomon@google.com            }
243042a2861b2aa7a7a9fff12503a4b297d6ee1d335bsalomon@google.com#endif
244042a2861b2aa7a7a9fff12503a4b297d6ee1d335bsalomon@google.com            REPORTER_ASSERT(reporter, gpu->programUnitTest(maxStages));
24567b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com        }
24667b915de99e6b89d476907930ac8c27afb64d10ebsalomon@google.com    }
247a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com}
248a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com
249a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com#include "TestClassDef.h"
250a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.comDEFINE_GPUTESTCLASS("GLPrograms", GLProgramsTestClass, GLProgramsTest)
251a8e686eb6cadb74039d3b624ece0d3ccb0684dccbsalomon@google.com
252d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com// This is evil evil evil. The linker may throw away whole translation units as dead code if it
25367e78c9e47c38a51816412a24a10f4fe2db142a3bsalomon@google.com// thinks none of the functions are called. It will do this even if there are static initializers
254a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com// in the unit that could pass pointers to functions from the unit out to other translation units!
255a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com// We force some of the effects that would otherwise be discarded to link here.
256a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com
257a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com#include "SkLightingImageFilter.h"
25882aa7482cbf55ce6d42c692550cadee5e23146e4bsalomon@google.com#include "SkMagnifierImageFilter.h"
25967e78c9e47c38a51816412a24a10f4fe2db142a3bsalomon@google.com#include "SkColorMatrixFilter.h"
26091a798f121a2238639f8e2d08cc776d4f0236cebcommit-bot@chromium.org#include "SkBitmapAlphaThresholdShader.h"
261a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com
262a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.comvoid forceLinking();
263a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com
264a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.comvoid forceLinking() {
265a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com    SkLightingImageFilter::CreateDistantLitDiffuse(SkPoint3(0,0,0), 0, 0, 0);
26682aa7482cbf55ce6d42c692550cadee5e23146e4bsalomon@google.com    SkMagnifierImageFilter mag(SkRect::MakeWH(SK_Scalar1, SK_Scalar1), SK_Scalar1);
267adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com    GrConfigConversionEffect::Create(NULL,
268adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com                                     false,
269adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com                                     GrConfigConversionEffect::kNone_PMConversion,
270adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com                                     SkMatrix::I());
27167e78c9e47c38a51816412a24a10f4fe2db142a3bsalomon@google.com    SkScalar matrix[20];
27267e78c9e47c38a51816412a24a10f4fe2db142a3bsalomon@google.com    SkColorMatrixFilter cmf(matrix);
27391a798f121a2238639f8e2d08cc776d4f0236cebcommit-bot@chromium.org    SkBitmapAlphaThresholdShader::Create(SkBitmap(), SkRegion(), 0x80);
274a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com}
275a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com
276cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
277