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