1f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com/* 2f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com * Copyright 2012 Google Inc. 3f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com * 4f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com * Use of this source code is governed by a BSD-style license that can be 5f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com * found in the LICENSE file. 6f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com */ 7f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com 8f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com#include "gl/GrGLShaderBuilder.h" 95259814305e3290dea3b197301f7824a14c5fa6ftomhudson@google.com#include "gl/GrGLProgram.h" 10dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com#include "gl/GrGLUniformHandle.h" 1177af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com#include "GrCoordTransform.h" 12c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com#include "GrDrawEffect.h" 13410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org#include "GrGpuGL.h" 14a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com#include "GrTexture.h" 15410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org#include "SkRTConf.h" 16933e65d914eb86b1fbbf8ea9cf1da58ac7c42500commit-bot@chromium.org#include "SkTraceEvent.h" 17410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 18261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org#define GL_CALL(X) GR_GL_CALL(this->gpu()->glInterface(), X) 19261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org#define GL_CALL_RET(R, X) GR_GL_CALL_RET(this->gpu()->glInterface(), R, X) 20f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com 21f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com// number of each input/output type in a single allocation block 22eb715c8d5caa2191d611c4f9cfb22b4afc6c8d02bsalomon@google.comstatic const int kVarsPerBlock = 8; 23f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com 24f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com// except FS outputs where we expect 2 at most. 25eb715c8d5caa2191d611c4f9cfb22b4afc6c8d02bsalomon@google.comstatic const int kMaxFSOutputs = 2; 26f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com 27d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com// ES2 FS only guarantees mediump and lowp support 28d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.comstatic const GrGLShaderVar::Precision kDefaultFragmentPrecision = GrGLShaderVar::kMedium_Precision; 29d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com 30dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.comtypedef GrGLUniformManager::UniformHandle UniformHandle; 31410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 32410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.orgSK_CONF_DECLARE(bool, c_PrintShaders, "gpu.printShaders", false, 33410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org "Print the source code for all shaders generated."); 34410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 35dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com/////////////////////////////////////////////////////////////////////////////// 36dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 3734bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.comnamespace { 38a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com 39410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.orginline const char* color_attribute_name() { return "aColor"; } 40410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.orginline const char* coverage_attribute_name() { return "aCoverage"; } 41410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.orginline const char* declared_color_output_name() { return "fsColorOut"; } 42410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.orginline const char* dual_source_output_name() { return "dualSourceOut"; } 432b1b8c083b969a2a798b03d1754a3fc99ea054dfbsalomon@google.cominline const char* sample_function_name(GrSLType type, GrGLSLGeneration glslGen) { 4434bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.com if (kVec2f_GrSLType == type) { 452b1b8c083b969a2a798b03d1754a3fc99ea054dfbsalomon@google.com return glslGen >= k130_GrGLSLGeneration ? "texture" : "texture2D"; 4634bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.com } else { 47f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(kVec3f_GrSLType == type); 482b1b8c083b969a2a798b03d1754a3fc99ea054dfbsalomon@google.com return glslGen >= k130_GrGLSLGeneration ? "textureProj" : "texture2DProj"; 4934bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.com } 50a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com} 51a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com 523390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgvoid append_texture_lookup(SkString* out, 533390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrGpuGL* gpu, 543390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org const char* samplerName, 553390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org const char* coordName, 563390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org uint32_t configComponentMask, 573390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org const char* swizzle, 583390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrSLType varyingType = kVec2f_GrSLType) { 593390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org SkASSERT(NULL != coordName); 603390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 613390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org out->appendf("%s(%s, %s)", 623390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org sample_function_name(varyingType, gpu->glslGeneration()), 633390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org samplerName, 643390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org coordName); 65a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com 666d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com char mangledSwizzle[5]; 676d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com 686d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com // The swizzling occurs using texture params instead of shader-mangling if ARB_texture_swizzle 696d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com // is available. 703390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org if (!gpu->glCaps().textureSwizzleSupport() && 713390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org (kA_GrColorComponentFlag == configComponentMask)) { 723390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org char alphaChar = gpu->glCaps().textureRedSupport() ? 'r' : 'a'; 736d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com int i; 746d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com for (i = 0; '\0' != swizzle[i]; ++i) { 756d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com mangledSwizzle[i] = alphaChar; 76a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com } 776d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com mangledSwizzle[i] ='\0'; 786d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com swizzle = mangledSwizzle; 79a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com } 8073d5b2f620c02f0741c9ce13091f108855f066aebsalomon@google.com // For shader prettiness we omit the swizzle rather than appending ".rgba". 8173d5b2f620c02f0741c9ce13091f108855f066aebsalomon@google.com if (memcmp(swizzle, "rgba", 4)) { 823390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org out->appendf(".%s", swizzle); 8373d5b2f620c02f0741c9ce13091f108855f066aebsalomon@google.com } 84a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com} 85a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com 8634bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.com} 8734bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.com 886b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.comstatic const char kDstCopyColorName[] = "_dstColor"; 89a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com 9026e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 919c639a406eec42c8f5169bd78ad93e58f00ea9f6tomhudson@google.com 920365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.orgbool GrGLShaderBuilder::GenProgram(GrGpuGL* gpu, 936eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org GrGLUniformManager* uman, 940365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org const GrGLProgramDesc& desc, 950365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org const GrEffectStage* inColorStages[], 960365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org const GrEffectStage* inCoverageStages[], 970365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org GenProgramOutput* output) { 98facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org SkAutoTDelete<GrGLShaderBuilder> builder; 990365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org if (desc.getHeader().fHasVertexCode ||!gpu->shouldUseFixedFunctionTexturing()) { 100facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org builder.reset(SkNEW_ARGS(GrGLFullShaderBuilder, (gpu, uman, desc))); 1010365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org } else { 102facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org builder.reset(SkNEW_ARGS(GrGLFragmentOnlyShaderBuilder, (gpu, uman, desc))); 103facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org } 104facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org if (builder->genProgram(inColorStages, inCoverageStages)) { 105facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org *output = builder->getOutput(); 106facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org return true; 1070365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org } 1080365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org return false; 1090365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org} 1100365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org 1110365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.orgbool GrGLShaderBuilder::genProgram(const GrEffectStage* colorStages[], 112facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org const GrEffectStage* coverageStages[]) { 1130365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); 1140365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org 1150365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org /////////////////////////////////////////////////////////////////////////// 116f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // emit code to read the dst copy texture, if necessary 1172db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com if (kNoDstRead_DstReadKey != header.fDstReadKey && 118410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GrGLCaps::kNone_FBFetchType == fGpu->glCaps().fbFetchType()) { 1192db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com bool topDown = SkToBool(kTopLeftOrigin_DstReadKeyBit & header.fDstReadKey); 12026e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com const char* dstCopyTopLeftName; 12126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com const char* dstCopyCoordScaleName; 122facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org const char* dstCopySamplerName; 12326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com uint32_t configMask; 1242db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com if (SkToBool(kUseAlphaConfig_DstReadKeyBit & header.fDstReadKey)) { 12526e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com configMask = kA_GrColorComponentFlag; 12626e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } else { 12726e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com configMask = kRGBA_GrColorComponentFlags; 12826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } 129facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fOutput.fUniformHandles.fDstCopySamplerUni = 130facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org this->addUniform(kFragment_Visibility, kSampler2D_GrSLType, "DstCopySampler", 131facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org &dstCopySamplerName); 132facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fOutput.fUniformHandles.fDstCopyTopLeftUni = 133facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org this->addUniform(kFragment_Visibility, kVec2f_GrSLType, "DstCopyUpperLeft", 134facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org &dstCopyTopLeftName); 135facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fOutput.fUniformHandles.fDstCopyScaleUni = 136facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org this->addUniform(kFragment_Visibility, kVec2f_GrSLType, "DstCopyCoordScale", 137facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org &dstCopyCoordScaleName); 13826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com const char* fragPos = this->fragmentPosition(); 13926e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com this->fsCodeAppend("\t// Read color from copy of the destination.\n"); 14026e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com this->fsCodeAppendf("\tvec2 _dstTexCoord = (%s.xy - %s) * %s;\n", 14126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com fragPos, dstCopyTopLeftName, dstCopyCoordScaleName); 14226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com if (!topDown) { 14326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com this->fsCodeAppend("\t_dstTexCoord.y = 1.0 - _dstTexCoord.y;\n"); 14426e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } 1456b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com this->fsCodeAppendf("\tvec4 %s = ", kDstCopyColorName); 1463390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org append_texture_lookup(&fFSCode, 1473390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org fGpu, 148facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org dstCopySamplerName, 1493390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org "_dstTexCoord", 1503390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org configMask, 1513390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org "rgba"); 15226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com this->fsCodeAppend(";\n\n"); 15326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } 154410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 155f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org /////////////////////////////////////////////////////////////////////////// 156f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // get the initial color and coverage to feed into the first effect in each effect chain 157f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 158f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org GrGLSLExpr4 inputColor; 159f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org GrGLSLExpr4 inputCoverage; 160f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 161261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org if (GrGLProgramDesc::kUniform_ColorInput == header.fColorInput) { 162261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const char* name; 163facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fOutput.fUniformHandles.fColorUni = 164facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org this->addUniform(GrGLShaderBuilder::kFragment_Visibility, kVec4f_GrSLType, "Color", 165facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org &name); 166f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org inputColor = GrGLSLExpr4(name); 167824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org } else if (GrGLProgramDesc::kSolidWhite_ColorInput == header.fColorInput) { 168f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org inputColor = GrGLSLExpr4(1); 169824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org } else if (GrGLProgramDesc::kTransBlack_ColorInput == header.fColorInput) { 170f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org inputColor = GrGLSLExpr4(0); 171261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org } 172261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org 173261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org if (GrGLProgramDesc::kUniform_ColorInput == header.fCoverageInput) { 174261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const char* name; 175facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fOutput.fUniformHandles.fCoverageUni = 176facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org this->addUniform(GrGLShaderBuilder::kFragment_Visibility, kVec4f_GrSLType, "Coverage", 177facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org &name); 178f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org inputCoverage = GrGLSLExpr4(name); 179824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org } else if (GrGLProgramDesc::kSolidWhite_ColorInput == header.fCoverageInput) { 180f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org inputCoverage = GrGLSLExpr4(1); 181824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org } else if (GrGLProgramDesc::kTransBlack_ColorInput == header.fCoverageInput) { 182f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org inputCoverage = GrGLSLExpr4(0); 183410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 184410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 185410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (k110_GrGLSLGeneration != fGpu->glslGeneration()) { 186410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fFSOutputs.push_back().set(kVec4f_GrSLType, 187410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GrGLShaderVar::kOut_TypeModifier, 188410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org declared_color_output_name()); 189410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fHasCustomColorOutput = true; 190410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 191f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 192f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org this->emitCodeBeforeEffects(&inputColor, &inputCoverage); 193f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 194f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org /////////////////////////////////////////////////////////////////////////// 195f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // emit the per-effect code for both color and coverage effects 196f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 197a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org fOutput.fColorEffects.reset(this->createAndEmitEffects(colorStages, 198a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org this->desc().getEffectKeys(), 199a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org this->desc().numColorEffects(), 200a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org &inputColor)); 201a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org 202a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org fOutput.fCoverageEffects.reset(this->createAndEmitEffects(coverageStages, 203f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org this->desc().getEffectKeys() + this->desc().numColorEffects(), 204f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org this->desc().numCoverageEffects(), 205a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org &inputCoverage)); 206f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 207f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org this->emitCodeAfterEffects(); 208f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 209f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org /////////////////////////////////////////////////////////////////////////// 210f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // write the secondary color output if necessary 211f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org if (GrGLProgramDesc::CoverageOutputUsesSecondaryOutput(header.fCoverageOutput)) { 212f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org const char* secondaryOutputName = this->enableSecondaryOutput(); 213f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 214f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // default coeff to ones for kCoverage_DualSrcOutput 215f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org GrGLSLExpr4 coeff(1); 216f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org if (GrGLProgramDesc::kSecondaryCoverageISA_CoverageOutput == header.fCoverageOutput) { 217f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // Get (1-A) into coeff 218f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org coeff = GrGLSLExpr4::VectorCast(GrGLSLExpr1(1) - inputColor.a()); 2194a24cd8ff41a8b3d292d60e4351a631240a7ed75humper } else if (GrGLProgramDesc::kSecondaryCoverageISC_CoverageOutput == 220f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org header.fCoverageOutput){ 221f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // Get (1-RGBA) into coeff 222f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org coeff = GrGLSLExpr4(1) - inputColor; 223f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org } 224f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // Get coeff * coverage into modulate and then write that to the dual source output. 225f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org this->fsCodeAppendf("\t%s = %s;\n", secondaryOutputName, (coeff * inputCoverage).c_str()); 226f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org } 227f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 228f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org /////////////////////////////////////////////////////////////////////////// 229f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // combine color and coverage as frag color 230f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 231f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // Get "color * coverage" into fragColor 232f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org GrGLSLExpr4 fragColor = inputColor * inputCoverage; 233f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // Now tack on "+(1-coverage)dst onto the frag color if we were asked to do so. 234f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org if (GrGLProgramDesc::kCombineWithDst_CoverageOutput == header.fCoverageOutput) { 235f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org GrGLSLExpr4 dstCoeff = GrGLSLExpr4(1) - inputCoverage; 236f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 237f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org GrGLSLExpr4 dstContribution = dstCoeff * GrGLSLExpr4(this->dstColor()); 238f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 239f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org fragColor = fragColor + dstContribution; 240f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org } 241f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org this->fsCodeAppendf("\t%s = %s;\n", this->getColorOutputName(), fragColor.c_str()); 242f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 243f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org if (!this->finish()) { 244f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org return false; 245f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org } 246f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 247f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org return true; 248f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org} 249f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 250f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 251f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 252f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.orgGrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu, 253f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org GrGLUniformManager* uniformManager, 254f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org const GrGLProgramDesc& desc) 255f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org : fDesc(desc) 256f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org , fGpu(gpu) 257f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org , fUniformManager(SkRef(uniformManager)) 258f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org , fFSFeaturesAddedMask(0) 259f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org , fFSInputs(kVarsPerBlock) 260f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org , fFSOutputs(kMaxFSOutputs) 261f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org , fUniforms(kVarsPerBlock) 262f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org , fSetupFragPosition(false) 263f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFragPosKey) 264f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org , fHasCustomColorOutput(false) 265f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org , fHasSecondaryOutput(false) { 26626e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com} 26726e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com 26842eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.combool GrGLShaderBuilder::enableFeature(GLSLFeature feature) { 26942eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com switch (feature) { 27042eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com case kStandardDerivatives_GLSLFeature: 271410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (!fGpu->glCaps().shaderDerivativeSupport()) { 27242eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com return false; 27342eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com } 2749e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org if (kGLES_GrGLStandard == fGpu->glStandard()) { 27542eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com this->addFSFeature(1 << kStandardDerivatives_GLSLFeature, 27642eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com "GL_OES_standard_derivatives"); 27742eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com } 27842eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com return true; 27942eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com default: 28088cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Unexpected GLSLFeature requested."); 28142eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com return false; 28242eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com } 28342eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com} 28442eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com 28542eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.combool GrGLShaderBuilder::enablePrivateFeature(GLSLPrivateFeature feature) { 28642eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com switch (feature) { 28742eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com case kFragCoordConventions_GLSLPrivateFeature: 288410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (!fGpu->glCaps().fragCoordConventionsSupport()) { 28942eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com return false; 29042eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com } 291410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (fGpu->glslGeneration() < k150_GrGLSLGeneration) { 29242eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com this->addFSFeature(1 << kFragCoordConventions_GLSLPrivateFeature, 29342eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com "GL_ARB_fragment_coord_conventions"); 29442eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com } 29542eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com return true; 2966b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com case kEXTShaderFramebufferFetch_GLSLPrivateFeature: 297410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (GrGLCaps::kEXT_FBFetchType != fGpu->glCaps().fbFetchType()) { 2986b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com return false; 2996b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com } 3006b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com this->addFSFeature(1 << kEXTShaderFramebufferFetch_GLSLPrivateFeature, 3016b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com "GL_EXT_shader_framebuffer_fetch"); 3026b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com return true; 3036b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com case kNVShaderFramebufferFetch_GLSLPrivateFeature: 304410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (GrGLCaps::kNV_FBFetchType != fGpu->glCaps().fbFetchType()) { 3056b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com return false; 3066b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com } 3076b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com this->addFSFeature(1 << kNVShaderFramebufferFetch_GLSLPrivateFeature, 3086b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com "GL_NV_shader_framebuffer_fetch"); 3096b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com return true; 31042eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com default: 31188cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Unexpected GLSLPrivateFeature requested."); 31242eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com return false; 31342eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com } 31442eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com} 31542eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com 31642eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.comvoid GrGLShaderBuilder::addFSFeature(uint32_t featureBit, const char* extensionName) { 31742eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com if (!(featureBit & fFSFeaturesAddedMask)) { 31842eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com fFSExtensions.appendf("#extension %s: require\n", extensionName); 31942eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com fFSFeaturesAddedMask |= featureBit; 32042eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com } 32142eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com} 32242eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com 323504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.comvoid GrGLShaderBuilder::nameVariable(SkString* out, char prefix, const char* name) { 324504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com if ('\0' == prefix) { 325504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com *out = name; 326504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com } else { 327504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com out->printf("%c%s", prefix, name); 328504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com } 329504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com if (fCodeStage.inStageCode()) { 330504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com if (out->endsWith('_')) { 331504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com // Names containing "__" are reserved. 332504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com out->append("x"); 333504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com } 334504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com out->appendf("_Stage%d", fCodeStage.stageIndex()); 335504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com } 336504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com} 337504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com 3386b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.comconst char* GrGLShaderBuilder::dstColor() { 3398d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org if (fCodeStage.inStageCode()) { 340a4acf12a9353ffc834d2c6ee673be447487963c9commit-bot@chromium.org const GrEffectRef& effect = *fCodeStage.effectStage()->getEffect(); 3418d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org if (!effect->willReadDstColor()) { 34288cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkDEBUGFAIL("GrGLEffect asked for dst color but its generating GrEffect " 3438d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org "did not request access."); 3448d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org return ""; 3458d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org } 3468d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org } 3476b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com static const char kFBFetchColorName[] = "gl_LastFragData[0]"; 348410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GrGLCaps::FBFetchType fetchType = fGpu->glCaps().fbFetchType(); 3496b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com if (GrGLCaps::kEXT_FBFetchType == fetchType) { 3506b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com SkAssertResult(this->enablePrivateFeature(kEXTShaderFramebufferFetch_GLSLPrivateFeature)); 3516b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com return kFBFetchColorName; 3526b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com } else if (GrGLCaps::kNV_FBFetchType == fetchType) { 3536b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com SkAssertResult(this->enablePrivateFeature(kNVShaderFramebufferFetch_GLSLPrivateFeature)); 3546b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com return kFBFetchColorName; 355facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org } else if (fOutput.fUniformHandles.fDstCopySamplerUni.isValid()) { 3566b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com return kDstCopyColorName; 35726e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } else { 3588d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org return ""; 35926e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } 360f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com} 361f9ad8867f2bcd8563862b0a5a90b473ad020d465tomhudson@google.com 362868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.comvoid GrGLShaderBuilder::appendTextureLookup(SkString* out, 363f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com const GrGLShaderBuilder::TextureSampler& sampler, 364868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com const char* coordName, 365868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com GrSLType varyingType) const { 3663390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org append_texture_lookup(out, 3673390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org fGpu, 3683390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org this->getUniformCStr(sampler.samplerUniform()), 3693390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org coordName, 3703390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org sampler.configComponentMask(), 3713390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org sampler.swizzle(), 3723390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org varyingType); 3735259814305e3290dea3b197301f7824a14c5fa6ftomhudson@google.com} 3745259814305e3290dea3b197301f7824a14c5fa6ftomhudson@google.com 37574a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.orgvoid GrGLShaderBuilder::fsAppendTextureLookup(const GrGLShaderBuilder::TextureSampler& sampler, 37674a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org const char* coordName, 37774a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org GrSLType varyingType) { 378f910d3b23bcf590ee937628dbab8e39a98ee5860bsalomon@google.com this->appendTextureLookup(&fFSCode, sampler, coordName, varyingType); 379f910d3b23bcf590ee937628dbab8e39a98ee5860bsalomon@google.com} 380f910d3b23bcf590ee937628dbab8e39a98ee5860bsalomon@google.com 38174a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.orgvoid GrGLShaderBuilder::fsAppendTextureLookupAndModulate( 382f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com const char* modulation, 383f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com const GrGLShaderBuilder::TextureSampler& sampler, 384f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com const char* coordName, 385f910d3b23bcf590ee937628dbab8e39a98ee5860bsalomon@google.com GrSLType varyingType) { 386868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com SkString lookup; 387f06df1bb9ab201a78bfc906a9e95326c6e15a119bsalomon@google.com this->appendTextureLookup(&lookup, sampler, coordName, varyingType); 388a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org fFSCode.append((GrGLSLExpr4(modulation) * GrGLSLExpr4(lookup)).c_str()); 3895259814305e3290dea3b197301f7824a14c5fa6ftomhudson@google.com} 3905259814305e3290dea3b197301f7824a14c5fa6ftomhudson@google.com 39126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.comGrGLShaderBuilder::DstReadKey GrGLShaderBuilder::KeyForDstRead(const GrTexture* dstCopy, 39226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com const GrGLCaps& caps) { 39326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com uint32_t key = kYesDstRead_DstReadKeyBit; 3946b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com if (GrGLCaps::kNone_FBFetchType != caps.fbFetchType()) { 3956b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com return key; 3966b0cf0273fdffbbdf69235b57b5b5a311e7f1ca6bsalomon@google.com } 397f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != dstCopy); 39826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com if (!caps.textureSwizzleSupport() && GrPixelConfigIsAlphaOnly(dstCopy->config())) { 39926e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com // The fact that the config is alpha-only must be considered when generating code. 40026e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com key |= kUseAlphaConfig_DstReadKeyBit; 40126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } 40226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com if (kTopLeft_GrSurfaceOrigin == dstCopy->origin()) { 40326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com key |= kTopLeftOrigin_DstReadKeyBit; 404a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com } 405f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(static_cast<DstReadKey>(key) == key); 40626e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com return static_cast<DstReadKey>(key); 407a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com} 408a5e65ec434fed44dc616e4f64950b835b541181btwiz@google.com 409b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.comGrGLShaderBuilder::FragPosKey GrGLShaderBuilder::KeyForFragmentPosition(const GrRenderTarget* dst, 410b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.com const GrGLCaps&) { 411b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.com if (kTopLeft_GrSurfaceOrigin == dst->origin()) { 412b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.com return kTopLeftFragPosRead_FragPosKey; 413b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.com } else { 414b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.com return kBottomLeftFragPosRead_FragPosKey; 415b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.com } 416b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.com} 417b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.com 418b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.com 4196d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.comconst GrGLenum* GrGLShaderBuilder::GetTexParamSwizzle(GrPixelConfig config, const GrGLCaps& caps) { 4206d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com if (caps.textureSwizzleSupport() && GrPixelConfigIsAlphaOnly(config)) { 4216d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com if (caps.textureRedSupport()) { 4226d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com static const GrGLenum gRedSmear[] = { GR_GL_RED, GR_GL_RED, GR_GL_RED, GR_GL_RED }; 4236d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com return gRedSmear; 4246d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com } else { 4256d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com static const GrGLenum gAlphaSmear[] = { GR_GL_ALPHA, GR_GL_ALPHA, 4266d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com GR_GL_ALPHA, GR_GL_ALPHA }; 4276d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com return gAlphaSmear; 4286d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com } 4296d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com } else { 4306d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com static const GrGLenum gStraight[] = { GR_GL_RED, GR_GL_GREEN, GR_GL_BLUE, GR_GL_ALPHA }; 4316d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com return gStraight; 4326d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com } 4336d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com} 4346d003d1ddced3e71684b8b3785d1e5a16255688dbsalomon@google.com 435777c3aab0a902b0917871080d99b0a249ec06298bsalomon@google.comGrGLUniformManager::UniformHandle GrGLShaderBuilder::addUniformArray(uint32_t visibility, 436777c3aab0a902b0917871080d99b0a249ec06298bsalomon@google.com GrSLType type, 437777c3aab0a902b0917871080d99b0a249ec06298bsalomon@google.com const char* name, 438777c3aab0a902b0917871080d99b0a249ec06298bsalomon@google.com int count, 439777c3aab0a902b0917871080d99b0a249ec06298bsalomon@google.com const char** outName) { 440f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(name && strlen(name)); 44174a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org SkDEBUGCODE(static const uint32_t kVisibilityMask = kVertex_Visibility | kFragment_Visibility); 442f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(0 == (~kVisibilityMask & visibility)); 443f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(0 != visibility); 444242ed6fb6c3c0dff780ed3bef47d36a3b34a352ctomhudson@google.com 445dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com BuilderUniform& uni = fUniforms.push_back(); 4467425c124f685978a0a6f0a1f79e89154019e7c99commit-bot@chromium.org UniformHandle h = GrGLUniformManager::UniformHandle::CreateFromUniformIndex(fUniforms.count() - 1); 4471acc3d7cc28c5631b5300578ab13439bdefd4e33commit-bot@chromium.org SkDEBUGCODE(UniformHandle h2 =) 4486eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org fUniformManager->appendUniform(type, count); 449dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com // We expect the uniform manager to initially have no uniforms and that all uniforms are added 450dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com // by this function. Therefore, the handles should match. 451f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(h2 == h); 452032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com uni.fVariable.setType(type); 453032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com uni.fVariable.setTypeModifier(GrGLShaderVar::kUniform_TypeModifier); 454504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com this->nameVariable(uni.fVariable.accessName(), 'u', name); 455032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com uni.fVariable.setArrayCount(count); 456032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com uni.fVisibility = visibility; 457242ed6fb6c3c0dff780ed3bef47d36a3b34a352ctomhudson@google.com 458032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com // If it is visible in both the VS and FS, the precision must match. 459032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com // We declare a default FS precision, but not a default VS. So set the var 460032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com // to use the default FS precision. 46174a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org if ((kVertex_Visibility | kFragment_Visibility) == visibility) { 462d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com // the fragment and vertex precisions must match 463032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com uni.fVariable.setPrecision(kDefaultFragmentPrecision); 464242ed6fb6c3c0dff780ed3bef47d36a3b34a352ctomhudson@google.com } 465242ed6fb6c3c0dff780ed3bef47d36a3b34a352ctomhudson@google.com 466777c3aab0a902b0917871080d99b0a249ec06298bsalomon@google.com if (NULL != outName) { 467777c3aab0a902b0917871080d99b0a249ec06298bsalomon@google.com *outName = uni.fVariable.c_str(); 468777c3aab0a902b0917871080d99b0a249ec06298bsalomon@google.com } 469777c3aab0a902b0917871080d99b0a249ec06298bsalomon@google.com 470032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com return h; 471032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com} 472032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com 47377af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.comSkString GrGLShaderBuilder::ensureFSCoords2D(const TransformedCoordsArray& coords, int index) { 47477af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com if (kVec3f_GrSLType != coords[index].type()) { 47577af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com SkASSERT(kVec2f_GrSLType == coords[index].type()); 47677af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com return coords[index].getName(); 47777af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com } 47877af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com 47977af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com SkString coords2D("coords2D"); 48077af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com if (0 != index) { 48177af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com coords2D.appendf("_%i", index); 48277af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com } 48377af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com this->fsCodeAppendf("\tvec2 %s = %s.xy / %s.z;", 48477af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com coords2D.c_str(), coords[index].c_str(), coords[index].c_str()); 48577af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com return coords2D; 48677af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com} 48777af6805e5faea1e2a5c0220098aec9082f3a6e5bsalomon@google.com 488706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.comconst char* GrGLShaderBuilder::fragmentPosition() { 4898d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org if (fCodeStage.inStageCode()) { 490a4acf12a9353ffc834d2c6ee673be447487963c9commit-bot@chromium.org const GrEffectRef& effect = *fCodeStage.effectStage()->getEffect(); 4918d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org if (!effect->willReadFragmentPosition()) { 49288cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkDEBUGFAIL("GrGLEffect asked for frag position but its generating GrEffect " 4938d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org "did not request access."); 4948d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org return ""; 4958d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org } 4968d47ddc19a40d1984bf1f384d711d36ab59fd1c0commit-bot@chromium.org } 4975f6ac03b00adb3e019ef828fa0ecd2292192955dcommit-bot@chromium.org // We only declare "gl_FragCoord" when we're in the case where we want to use layout qualifiers 4985f6ac03b00adb3e019ef828fa0ecd2292192955dcommit-bot@chromium.org // to reverse y. Otherwise it isn't necessary and whether the "in" qualifier appears in the 4995f6ac03b00adb3e019ef828fa0ecd2292192955dcommit-bot@chromium.org // declaration varies in earlier GLSL specs. So it is simpler to omit it. 500b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.com if (fTopLeftFragPosRead) { 5015f6ac03b00adb3e019ef828fa0ecd2292192955dcommit-bot@chromium.org fSetupFragPosition = true; 502160a52ba217012ed73c240f6d67b3bbf2b4879d6bsalomon return "(gl_FragCoord.xy)"; 503410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } else if (fGpu->glCaps().fragCoordConventionsSupport()) { 504706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com if (!fSetupFragPosition) { 50542eff161a2acdbf03a71666b3fc31079a1bba86fbsalomon@google.com SkAssertResult(this->enablePrivateFeature(kFragCoordConventions_GLSLPrivateFeature)); 5065fa2107842e017ee5932955ecf89ceca179e4630bsalomon@google.com fFSInputs.push_back().set(kVec4f_GrSLType, 5075fa2107842e017ee5932955ecf89ceca179e4630bsalomon@google.com GrGLShaderVar::kIn_TypeModifier, 5085fa2107842e017ee5932955ecf89ceca179e4630bsalomon@google.com "gl_FragCoord", 5095fa2107842e017ee5932955ecf89ceca179e4630bsalomon@google.com GrGLShaderVar::kDefault_Precision, 5105fa2107842e017ee5932955ecf89ceca179e4630bsalomon@google.com GrGLShaderVar::kUpperLeft_Origin); 511706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com fSetupFragPosition = true; 512706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com } 513160a52ba217012ed73c240f6d67b3bbf2b4879d6bsalomon return "(gl_FragCoord.xy)"; 514706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com } else { 515706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com static const char* kCoordName = "fragCoordYDown"; 516706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com if (!fSetupFragPosition) { 517504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com // temporarily change the stage index because we're inserting non-stage code. 518504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com CodeStage::AutoStageRestore csar(&fCodeStage, NULL); 519504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com 520facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org SkASSERT(!fOutput.fUniformHandles.fRTHeightUni.isValid()); 521706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com const char* rtHeightName; 5221e34ff7030c95a96c3cd5940de9b4dda4e1cef86skia.committer@gmail.com 523facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fOutput.fUniformHandles.fRTHeightUni = 524facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org this->addUniform(kFragment_Visibility, kFloat_GrSLType, "RTHeight", &rtHeightName); 5251e34ff7030c95a96c3cd5940de9b4dda4e1cef86skia.committer@gmail.com 526160a52ba217012ed73c240f6d67b3bbf2b4879d6bsalomon this->fFSCode.prependf("\tvec2 %s = vec2(gl_FragCoord.x, %s - gl_FragCoord.y);\n", 527706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com kCoordName, rtHeightName); 528706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com fSetupFragPosition = true; 529706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com } 530facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org SkASSERT(fOutput.fUniformHandles.fRTHeightUni.isValid()); 531706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com return kCoordName; 532706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com } 533706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com} 534706f66831a575bdc2b1ab1331b48b793cd487356bsalomon@google.com 53574a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.orgvoid GrGLShaderBuilder::fsEmitFunction(GrSLType returnType, 53674a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org const char* name, 53774a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org int argCnt, 53874a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org const GrGLShaderVar* args, 53974a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org const char* body, 54074a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org SkString* outName) { 541018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com fFSFunctions.append(GrGLSLTypeString(returnType)); 542504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com this->nameVariable(outName, '\0', name); 54377cf460e5df7dd5272e71f9835880ded48fe8d12bsalomon@google.com fFSFunctions.appendf(" %s", outName->c_str()); 544a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com fFSFunctions.append("("); 545a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com for (int i = 0; i < argCnt; ++i) { 546410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org args[i].appendDecl(this->ctxInfo(), &fFSFunctions); 547a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com if (i < argCnt - 1) { 548a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com fFSFunctions.append(", "); 549a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com } 550a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com } 551a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com fFSFunctions.append(") {\n"); 552a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com fFSFunctions.append(body); 553a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com fFSFunctions.append("}\n\n"); 554a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com} 55523cb2299ddf8fc87df0d3f9bda78934382cf714dtomhudson@google.com 556ad5e937c110efaf9630159d2859fabc4f38f7ab2bsalomon@google.comnamespace { 557d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com 558d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.cominline void append_default_precision_qualifier(GrGLShaderVar::Precision p, 5599e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org GrGLStandard standard, 560d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com SkString* str) { 561d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com // Desktop GLSL has added precision qualifiers but they don't do anything. 5629e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org if (kGLES_GrGLStandard == standard) { 563d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com switch (p) { 564d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com case GrGLShaderVar::kHigh_Precision: 565d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com str->append("precision highp float;\n"); 566d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com break; 567d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com case GrGLShaderVar::kMedium_Precision: 568d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com str->append("precision mediump float;\n"); 569d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com break; 570d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com case GrGLShaderVar::kLow_Precision: 571d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com str->append("precision lowp float;\n"); 572d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com break; 573d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com case GrGLShaderVar::kDefault_Precision: 57488cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Default precision now allowed."); 575d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com default: 57688cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Unknown precision value."); 577d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com } 578d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com } 579d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com} 580032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com} 581d7727ceb82e271f8b5580c51571c57b09c5e3cedbsalomon@google.com 582032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.comvoid GrGLShaderBuilder::appendDecls(const VarArray& vars, SkString* out) const { 583ad5e937c110efaf9630159d2859fabc4f38f7ab2bsalomon@google.com for (int i = 0; i < vars.count(); ++i) { 584410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org vars[i].appendDecl(this->ctxInfo(), out); 585a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com out->append(";\n"); 586ad5e937c110efaf9630159d2859fabc4f38f7ab2bsalomon@google.com } 587ad5e937c110efaf9630159d2859fabc4f38f7ab2bsalomon@google.com} 588032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com 58974a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.orgvoid GrGLShaderBuilder::appendUniformDecls(ShaderVisibility visibility, 59074a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org SkString* out) const { 591032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com for (int i = 0; i < fUniforms.count(); ++i) { 59274a3a2135ca82ab9324b7e499caa3280348a4fdacommit-bot@chromium.org if (fUniforms[i].fVisibility & visibility) { 593410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fUniforms[i].fVariable.appendDecl(this->ctxInfo(), out); 594a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com out->append(";\n"); 595032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com } 596032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7absalomon@google.com } 597ad5e937c110efaf9630159d2859fabc4f38f7ab2bsalomon@google.com} 598ad5e937c110efaf9630159d2859fabc4f38f7ab2bsalomon@google.com 599261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgvoid GrGLShaderBuilder::createAndEmitEffects(GrGLProgramEffectsBuilder* programEffectsBuilder, 600261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const GrEffectStage* effectStages[], 601261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const EffectKey effectKeys[], 602261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org int effectCnt, 603a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org GrGLSLExpr4* fsInOutColor) { 604504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com bool effectEmitted = false; 605504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com 606a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org GrGLSLExpr4 inColor = *fsInOutColor; 607a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org GrGLSLExpr4 outColor; 608504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com 609504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com for (int e = 0; e < effectCnt; ++e) { 610a4acf12a9353ffc834d2c6ee673be447487963c9commit-bot@chromium.org SkASSERT(NULL != effectStages[e] && NULL != effectStages[e]->getEffect()); 611a4acf12a9353ffc834d2c6ee673be447487963c9commit-bot@chromium.org const GrEffectStage& stage = *effectStages[e]; 612504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com 613a4acf12a9353ffc834d2c6ee673be447487963c9commit-bot@chromium.org CodeStage::AutoStageRestore csar(&fCodeStage, &stage); 614504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com 615824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org if (inColor.isZeros()) { 616824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org SkString inColorName; 617824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org 618504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com // Effects have no way to communicate zeros, they treat an empty string as ones. 619824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org this->nameVariable(&inColorName, '\0', "input"); 620824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org this->fsCodeAppendf("\tvec4 %s = %s;\n", inColorName.c_str(), inColor.c_str()); 621824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org inColor = inColorName; 622ff6ea2663f76aa85ec55ddd0f00ca7906f1bc4e3commit-bot@chromium.org } 623ff6ea2663f76aa85ec55ddd0f00ca7906f1bc4e3commit-bot@chromium.org 624504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com // create var to hold stage result 625824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org SkString outColorName; 626824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org this->nameVariable(&outColorName, '\0', "output"); 627824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org this->fsCodeAppendf("\tvec4 %s;\n", outColorName.c_str()); 628824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org outColor = outColorName; 629824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org 63034cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com 631261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org programEffectsBuilder->emitEffect(stage, 632261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org effectKeys[e], 633261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org outColor.c_str(), 634824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org inColor.isOnes() ? NULL : inColor.c_str(), 635261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org fCodeStage.stageIndex()); 63634cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com 637504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com inColor = outColor; 638504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com effectEmitted = true; 639504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com } 640504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com 641504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com if (effectEmitted) { 642504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com *fsInOutColor = outColor; 643504976ef6f1b969c2ac13ff1140ea1067f085ffabsalomon@google.com } 64434cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com} 645ff6ea2663f76aa85ec55ddd0f00ca7906f1bc4e3commit-bot@chromium.org 646410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.orgconst char* GrGLShaderBuilder::getColorOutputName() const { 647410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor"; 648410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org} 649410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 650410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.orgconst char* GrGLShaderBuilder::enableSecondaryOutput() { 651410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (!fHasSecondaryOutput) { 652410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fFSOutputs.push_back().set(kVec4f_GrSLType, 653410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GrGLShaderVar::kOut_TypeModifier, 654410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org dual_source_output_name()); 655410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fHasSecondaryOutput = true; 656410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 657410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return dual_source_output_name(); 658410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org} 659410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 660facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.orgbool GrGLShaderBuilder::finish() { 661facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org SkASSERT(0 == fOutput.fProgramID); 662facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org GL_CALL_RET(fOutput.fProgramID, CreateProgram()); 663facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org if (!fOutput.fProgramID) { 664410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return false; 665410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 666410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 667d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org SkTDArray<GrGLuint> shadersToDelete; 668d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org 669facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org if (!this->compileAndAttachShaders(fOutput.fProgramID, &shadersToDelete)) { 670facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org GL_CALL(DeleteProgram(fOutput.fProgramID)); 671410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return false; 672410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 673410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 674facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org this->bindProgramLocations(fOutput.fProgramID); 6756eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org if (fUniformManager->isUsingBindUniform()) { 676facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fUniformManager->getUniformLocations(fOutput.fProgramID, fUniforms); 677d3baf20dd1de9940717dd50b5c9ff6061561342ecommit-bot@chromium.org } 678410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 679facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org GL_CALL(LinkProgram(fOutput.fProgramID)); 680c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org 681c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org // Calling GetProgramiv is expensive in Chromium. Assume success in release builds. 682c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org bool checkLinked = !fGpu->ctxInfo().isChromium(); 683c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org#ifdef SK_DEBUG 684c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org checkLinked = true; 685c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org#endif 686c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org if (checkLinked) { 687c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GrGLint linked = GR_GL_INIT_ZERO; 688facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org GL_CALL(GetProgramiv(fOutput.fProgramID, GR_GL_LINK_STATUS, &linked)); 689c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org if (!linked) { 690c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GrGLint infoLen = GR_GL_INIT_ZERO; 691facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org GL_CALL(GetProgramiv(fOutput.fProgramID, GR_GL_INFO_LOG_LENGTH, &infoLen)); 692c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugger 693c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org if (infoLen > 0) { 694c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org // retrieve length even though we don't need it to workaround 695c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org // bug in chrome cmd buffer param validation. 696c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GrGLsizei length = GR_GL_INIT_ZERO; 697facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org GL_CALL(GetProgramInfoLog(fOutput.fProgramID, 698c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org infoLen+1, 699c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org &length, 700c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org (char*)log.get())); 701c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GrPrintf((char*)log.get()); 702c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org } 703c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org SkDEBUGFAIL("Error linking program"); 704facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org GL_CALL(DeleteProgram(fOutput.fProgramID)); 705facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fOutput.fProgramID = 0; 706c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org return false; 707410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 708410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 709410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 7106eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org if (!fUniformManager->isUsingBindUniform()) { 711facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fUniformManager->getUniformLocations(fOutput.fProgramID, fUniforms); 712d3baf20dd1de9940717dd50b5c9ff6061561342ecommit-bot@chromium.org } 713d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org 714d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org for (int i = 0; i < shadersToDelete.count(); ++i) { 715d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org GL_CALL(DeleteShader(shadersToDelete[i])); 716d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org } 717d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org 718410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return true; 719410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org} 720410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 721d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org// Compiles a GL shader and attaches it to a program. Returns the shader ID if 722d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org// successful, or 0 if not. 723d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.orgstatic GrGLuint attach_shader(const GrGLContext& glCtx, 724d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org GrGLuint programId, 725d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org GrGLenum type, 726d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org const SkString& shaderSrc) { 727c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org const GrGLInterface* gli = glCtx.interface(); 728c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org 729410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GrGLuint shaderId; 730410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GR_GL_CALL_RET(gli, shaderId, CreateShader(type)); 731410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (0 == shaderId) { 732d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org return 0; 733410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 734410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 735410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org const GrGLchar* sourceStr = shaderSrc.c_str(); 736e9cd27d4a3c92393cc6c79d4d6f93d266411d95erobertphillips@google.com GrGLint sourceLength = static_cast<GrGLint>(shaderSrc.size()); 737410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GR_GL_CALL(gli, ShaderSource(shaderId, 1, &sourceStr, &sourceLength)); 738410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GR_GL_CALL(gli, CompileShader(shaderId)); 739c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org 740c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org // Calling GetShaderiv in Chromium is quite expensive. Assume success in release builds. 741b1854a85095f9924947bc00e665da47b0c0bdfb9commit-bot@chromium.org bool checkCompiled = !glCtx.isChromium(); 742c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org#ifdef SK_DEBUG 743c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org checkCompiled = true; 744c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org#endif 745c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org if (checkCompiled) { 746c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GrGLint compiled = GR_GL_INIT_ZERO; 747c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GR_GL_CALL(gli, GetShaderiv(shaderId, GR_GL_COMPILE_STATUS, &compiled)); 748c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org 749c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org if (!compiled) { 750c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GrGLint infoLen = GR_GL_INIT_ZERO; 751c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GR_GL_CALL(gli, GetShaderiv(shaderId, GR_GL_INFO_LOG_LENGTH, &infoLen)); 752c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugger 753c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org if (infoLen > 0) { 754c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org // retrieve length even though we don't need it to workaround bug in Chromium cmd 755c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org // buffer param validation. 756c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GrGLsizei length = GR_GL_INIT_ZERO; 757c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GR_GL_CALL(gli, GetShaderInfoLog(shaderId, infoLen+1, 758c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org &length, (char*)log.get())); 759c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GrPrintf(shaderSrc.c_str()); 760c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GrPrintf("\n%s", log.get()); 761c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org } 762c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org SkDEBUGFAIL("Shader compilation failed!"); 763c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org GR_GL_CALL(gli, DeleteShader(shaderId)); 764d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org return 0; 765410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 766c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org } 767c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org if (c_PrintShaders) { 768410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GrPrintf(shaderSrc.c_str()); 769410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GrPrintf("\n"); 770410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 771410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 772d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org // Attach the shader, but defer deletion until after we have linked the program. 773d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org // This works around a bug in the Android emulator's GLES2 wrapper which 774d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org // will immediately delete the shader object and free its memory even though it's 775d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org // attached to a program, which then causes glLinkProgram to fail. 776410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GR_GL_CALL(gli, AttachShader(programId, shaderId)); 777d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org 778d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org return shaderId; 779410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org} 780410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 781d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.orgbool GrGLShaderBuilder::compileAndAttachShaders(GrGLuint programId, SkTDArray<GrGLuint>* shaderIds) const { 782410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org SkString fragShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo())); 783410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fragShaderSrc.append(fFSExtensions); 784410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org append_default_precision_qualifier(kDefaultFragmentPrecision, 7859e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org fGpu->glStandard(), 786410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org &fragShaderSrc); 787410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org this->appendUniformDecls(kFragment_Visibility, &fragShaderSrc); 788410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org this->appendDecls(fFSInputs, &fragShaderSrc); 789410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org // We shouldn't have declared outputs on 1.10 790410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org SkASSERT(k110_GrGLSLGeneration != fGpu->glslGeneration() || fFSOutputs.empty()); 791410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org this->appendDecls(fFSOutputs, &fragShaderSrc); 792410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fragShaderSrc.append(fFSFunctions); 793410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fragShaderSrc.append("void main() {\n"); 794410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fragShaderSrc.append(fFSCode); 795410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fragShaderSrc.append("}\n"); 796d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org 797d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org GrGLuint fragShaderId = attach_shader(fGpu->glContext(), programId, GR_GL_FRAGMENT_SHADER, fragShaderSrc); 798d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org if (!fragShaderId) { 799410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return false; 800410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 801410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 802d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org *shaderIds->append() = fragShaderId; 803d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org 804410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return true; 805410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org} 806410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 807410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.orgvoid GrGLShaderBuilder::bindProgramLocations(GrGLuint programId) const { 808410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (fHasCustomColorOutput) { 809410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GL_CALL(BindFragDataLocation(programId, 0, declared_color_output_name())); 810410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 811410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (fHasSecondaryOutput) { 812410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GL_CALL(BindFragDataLocationIndexed(programId, 0, 1, dual_source_output_name())); 813410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 814410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org} 815410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 816410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.orgconst GrGLContextInfo& GrGLShaderBuilder::ctxInfo() const { 817410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return fGpu->ctxInfo(); 818410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org} 819410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 820261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////// 8215a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 822261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgGrGLFullShaderBuilder::GrGLFullShaderBuilder(GrGpuGL* gpu, 8236eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org GrGLUniformManager* uniformManager, 824261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const GrGLProgramDesc& desc) 825261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org : INHERITED(gpu, uniformManager, desc) 826410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org , fVSAttrs(kVarsPerBlock) 8275a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org , fVSOutputs(kVarsPerBlock) 8285a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org , fGSInputs(kVarsPerBlock) 829410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org , fGSOutputs(kVarsPerBlock) { 830f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org} 831410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 832f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.orgvoid GrGLFullShaderBuilder::emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr4* coverage) { 8330365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); 8345a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 835facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fOutput.fHasVertexShader = true; 836facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org 8375a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fPositionVar = &fVSAttrs.push_back(); 8385a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, "aPosition"); 8395a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org if (-1 != header.fLocalCoordAttributeIndex) { 8405a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fLocalCoordsVar = &fVSAttrs.push_back(); 8415a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fLocalCoordsVar->set(kVec2f_GrSLType, 8425a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org GrGLShaderVar::kAttribute_TypeModifier, 8435a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org "aLocalCoords"); 8445a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org } else { 8455a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fLocalCoordsVar = fPositionVar; 8465a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org } 847410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 848410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org const char* viewMName; 849facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fOutput.fUniformHandles.fViewMatrixUni = 850facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org this->addUniform(GrGLShaderBuilder::kVertex_Visibility, kMat33f_GrSLType, "ViewM", 851facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org &viewMName); 852410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 85347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org // Transform the position into Skia's device coords. 85447c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org this->vsCodeAppendf("\tvec3 pos3 = %s * vec3(%s, 1);\n", 855410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org viewMName, fPositionVar->c_str()); 856410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 857410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org // we output point size in the GS if present 858410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (header.fEmitsPointSize 859410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org#if GR_GL_EXPERIMENTAL_GS 860410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org && !header.fExperimentalGS 861410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org#endif 862410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org ) { 863410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org this->vsCodeAppend("\tgl_PointSize = 1.0;\n"); 864410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 865261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org 866261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org if (GrGLProgramDesc::kAttribute_ColorInput == header.fColorInput) { 867261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->addAttribute(kVec4f_GrSLType, color_attribute_name()); 868261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const char *vsName, *fsName; 869261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->addVarying(kVec4f_GrSLType, "Color", &vsName, &fsName); 870261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->vsCodeAppendf("\t%s = %s;\n", vsName, color_attribute_name()); 871f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org *color = fsName; 872261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org } 873261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org 874261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org if (GrGLProgramDesc::kAttribute_ColorInput == header.fCoverageInput) { 875261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->addAttribute(kVec4f_GrSLType, coverage_attribute_name()); 876261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const char *vsName, *fsName; 877261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->addVarying(kVec4f_GrSLType, "Coverage", &vsName, &fsName); 878261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->vsCodeAppendf("\t%s = %s;\n", vsName, coverage_attribute_name()); 879f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org *coverage = fsName; 880261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org } 8815a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org} 8825a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 883f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.orgvoid GrGLFullShaderBuilder::emitCodeAfterEffects() { 884f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org const char* rtAdjustName; 885f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org fOutput.fUniformHandles.fRTAdjustmentUni = 886f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org this->addUniform(GrGLShaderBuilder::kVertex_Visibility, kVec4f_GrSLType, "rtAdjustment", 887f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org &rtAdjustName); 888f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 889f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org // Transform from Skia's device coords to GL's normalized device coords. 890f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org this->vsCodeAppendf( 891f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org "\tgl_Position = vec4(dot(pos3.xz, %s.xy), dot(pos3.yz, %s.zw), 0, pos3.z);\n", 892f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org rtAdjustName, rtAdjustName); 893f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org} 894f7f9aa0e4721624395d247ffa1f0128cfac95341commit-bot@chromium.org 895261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgbool GrGLFullShaderBuilder::addAttribute(GrSLType type, const char* name) { 8965a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org for (int i = 0; i < fVSAttrs.count(); ++i) { 8975a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org const GrGLShaderVar& attr = fVSAttrs[i]; 8985a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org // if attribute already added, don't add it again 8995a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org if (attr.getName().equals(name)) { 9005a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org SkASSERT(attr.getType() == type); 9015a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org return false; 9025a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org } 9035a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org } 9045a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fVSAttrs.push_back().set(type, 9055a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org GrGLShaderVar::kAttribute_TypeModifier, 9065a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org name); 9075a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org return true; 9085a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org} 9095a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 910261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgbool GrGLFullShaderBuilder::addEffectAttribute(int attributeIndex, 911261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org GrSLType type, 912261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const SkString& name) { 9135a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org if (!this->addAttribute(type, name.c_str())) { 9145a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org return false; 9155a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org } 9165a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 9175a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fEffectAttributes.push_back().set(attributeIndex, name); 9185a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org return true; 9195a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org} 9205a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 921261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgvoid GrGLFullShaderBuilder::addVarying(GrSLType type, 922261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const char* name, 923261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const char** vsOutName, 924261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const char** fsInName) { 9255a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fVSOutputs.push_back(); 9265a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fVSOutputs.back().setType(type); 9275a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fVSOutputs.back().setTypeModifier(GrGLShaderVar::kVaryingOut_TypeModifier); 928261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->nameVariable(fVSOutputs.back().accessName(), 'v', name); 9295a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 9305a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org if (vsOutName) { 9315a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org *vsOutName = fVSOutputs.back().getName().c_str(); 9325a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org } 9335a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org // input to FS comes either from VS or GS 9345a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org const SkString* fsName; 935410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org#if GR_GL_EXPERIMENTAL_GS 9360365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org if (this->desc().getHeader().fExperimentalGS) { 9375a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org // if we have a GS take each varying in as an array 9385a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org // and output as non-array. 9395a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fGSInputs.push_back(); 9405a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fGSInputs.back().setType(type); 9415a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fGSInputs.back().setTypeModifier(GrGLShaderVar::kVaryingIn_TypeModifier); 9425a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fGSInputs.back().setUnsizedArray(); 9435a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org *fGSInputs.back().accessName() = fVSOutputs.back().getName(); 9445a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fGSOutputs.push_back(); 9455a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fGSOutputs.back().setType(type); 9465a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fGSOutputs.back().setTypeModifier(GrGLShaderVar::kVaryingOut_TypeModifier); 947261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->nameVariable(fGSOutputs.back().accessName(), 'g', name); 9485a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fsName = fGSOutputs.back().accessName(); 949410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } else 950410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org#endif 951410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org { 9525a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org fsName = fVSOutputs.back().accessName(); 9535a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org } 954261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->fsInputAppend().set(type, GrGLShaderVar::kVaryingIn_TypeModifier, *fsName); 9555a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org if (fsInName) { 9565a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org *fsInName = fsName->c_str(); 9575a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org } 9585a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org} 9595a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 960261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgconst SkString* GrGLFullShaderBuilder::getEffectAttributeName(int attributeIndex) const { 961410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org const AttributePair* attribEnd = fEffectAttributes.end(); 962410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org for (const AttributePair* attrib = fEffectAttributes.begin(); attrib != attribEnd; ++attrib) { 963410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (attrib->fIndex == attributeIndex) { 964410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return &attrib->fName; 965410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 966410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 967410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 968410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return NULL; 9695a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org} 9705a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 971261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgGrGLProgramEffects* GrGLFullShaderBuilder::createAndEmitEffects( 972261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const GrEffectStage* effectStages[], 973261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org const EffectKey effectKeys[], 974261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org int effectCnt, 975a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org GrGLSLExpr4* inOutFSColor) { 976261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org 977261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt); 978261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->INHERITED::createAndEmitEffects(&programEffectsBuilder, 979261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org effectStages, 980261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org effectKeys, 981261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org effectCnt, 982824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org inOutFSColor); 983261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org return programEffectsBuilder.finish(); 984261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org} 985261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org 9860365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.orgbool GrGLFullShaderBuilder::compileAndAttachShaders(GrGLuint programId, 9870365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org SkTDArray<GrGLuint>* shaderIds) const { 988c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org const GrGLContext& glCtx = this->gpu()->glContext(); 989261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org SkString vertShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo())); 990261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->appendUniformDecls(kVertex_Visibility, &vertShaderSrc); 991261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->appendDecls(fVSAttrs, &vertShaderSrc); 992261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->appendDecls(fVSOutputs, &vertShaderSrc); 993410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org vertShaderSrc.append("void main() {\n"); 994410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org vertShaderSrc.append(fVSCode); 995410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org vertShaderSrc.append("}\n"); 996d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org GrGLuint vertShaderId = attach_shader(glCtx, programId, GR_GL_VERTEX_SHADER, vertShaderSrc); 997d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org if (!vertShaderId) { 998410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return false; 9995a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org } 1000d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org *shaderIds->append() = vertShaderId; 10015a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 1002410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org#if GR_GL_EXPERIMENTAL_GS 10030365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org if (this->desc().getHeader().fExperimentalGS) { 1004261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org SkASSERT(this->ctxInfo().glslGeneration() >= k150_GrGLSLGeneration); 1005261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org SkString geomShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo())); 1006410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org geomShaderSrc.append("layout(triangles) in;\n" 1007410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org "layout(triangle_strip, max_vertices = 6) out;\n"); 1008261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->appendDecls(fGSInputs, &geomShaderSrc); 1009261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->appendDecls(fGSOutputs, &geomShaderSrc); 1010410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org geomShaderSrc.append("void main() {\n"); 1011410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org geomShaderSrc.append("\tfor (int i = 0; i < 3; ++i) {\n" 1012410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org "\t\tgl_Position = gl_in[i].gl_Position;\n"); 10130365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org if (this->desc().getHeader().fEmitsPointSize) { 1014410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org geomShaderSrc.append("\t\tgl_PointSize = 1.0;\n"); 1015410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 1016410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org SkASSERT(fGSInputs.count() == fGSOutputs.count()); 1017410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org for (int i = 0; i < fGSInputs.count(); ++i) { 1018410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org geomShaderSrc.appendf("\t\t%s = %s[i];\n", 1019410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fGSOutputs[i].getName().c_str(), 1020410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fGSInputs[i].getName().c_str()); 1021410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 1022410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org geomShaderSrc.append("\t\tEmitVertex();\n" 1023410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org "\t}\n" 1024410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org "\tEndPrimitive();\n"); 1025410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org geomShaderSrc.append("}\n"); 1026d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org GrGLuint geomShaderId = attach_shader(glCtx, programId, GR_GL_GEOMETRY_SHADER, geomShaderSrc); 1027d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org if (!geomShaderId) { 1028410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org return false; 1029410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 1030d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org *shaderIds->append() = geomShaderId; 1031410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 1032410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org#endif 1033410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org 1034d328fb62938b1d7e43b07c619756dfdc781453b3commit-bot@chromium.org return this->INHERITED::compileAndAttachShaders(programId, shaderIds); 10355a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org} 10365a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 1037261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.orgvoid GrGLFullShaderBuilder::bindProgramLocations(GrGLuint programId) const { 1038261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org this->INHERITED::bindProgramLocations(programId); 1039261dc569b6a53729bea6e4e7a0cf2afa980eb82dcommit-bot@chromium.org 10400365261597f73c049f2d8c117c8c87ef2fb2c9abcommit-bot@chromium.org const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); 10415a02cb48fdff04dc274d4cb1af8c4dc65a503438commit-bot@chromium.org 1042410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org // Bind the attrib locations to same values for all shaders 1043410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org SkASSERT(-1 != header.fPositionAttributeIndex); 1044410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GL_CALL(BindAttribLocation(programId, 1045410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org header.fPositionAttributeIndex, 1046410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fPositionVar->c_str())); 1047410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (-1 != header.fLocalCoordAttributeIndex) { 1048410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GL_CALL(BindAttribLocation(programId, 1049410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org header.fLocalCoordAttributeIndex, 1050410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org fLocalCoordsVar->c_str())); 1051410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 1052410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (-1 != header.fColorAttributeIndex) { 1053410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GL_CALL(BindAttribLocation(programId, 1054410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org header.fColorAttributeIndex, 1055410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org color_attribute_name())); 1056410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 1057410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org if (-1 != header.fCoverageAttributeIndex) { 1058410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GL_CALL(BindAttribLocation(programId, 1059410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org header.fCoverageAttributeIndex, 1060410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org coverage_attribute_name())); 106191274b99722d9be62e077ab979c630c23cdd04b1skia.committer@gmail.com } 1062ff6ea2663f76aa85ec55ddd0f00ca7906f1bc4e3commit-bot@chromium.org 1063410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org const AttributePair* attribEnd = fEffectAttributes.end(); 1064410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org for (const AttributePair* attrib = fEffectAttributes.begin(); attrib != attribEnd; ++attrib) { 1065410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org GL_CALL(BindAttribLocation(programId, attrib->fIndex, attrib->fName.c_str())); 1066410552a73d59611901033b2bc5147cc6ade0207ccommit-bot@chromium.org } 1067ff6ea2663f76aa85ec55ddd0f00ca7906f1bc4e3commit-bot@chromium.org} 10686b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org 10696b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////// 10706b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org 10716b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.orgGrGLFragmentOnlyShaderBuilder::GrGLFragmentOnlyShaderBuilder(GrGpuGL* gpu, 10726eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org GrGLUniformManager* uniformManager, 10736b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org const GrGLProgramDesc& desc) 1074facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org : INHERITED(gpu, uniformManager, desc) { 10756b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org SkASSERT(!desc.getHeader().fHasVertexCode); 1076c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org SkASSERT(gpu->glCaps().pathRenderingSupport()); 10776b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fColorInput); 10786b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fCoverageInput); 10796b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org} 10806b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org 10818e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.orgint GrGLFragmentOnlyShaderBuilder::addTexCoordSets(int count) { 1082facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org int firstFreeCoordSet = fOutput.fTexCoordSetCnt; 1083facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org fOutput.fTexCoordSetCnt += count; 1084facad13fa840d362a8ea40161916fe609cb52657commit-bot@chromium.org SkASSERT(gpu()->glCaps().maxFixedFunctionTextureCoords() >= fOutput.fTexCoordSetCnt); 10858e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org return firstFreeCoordSet; 10868e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org} 10878e919add406c5d20918a7f0ca811317312e6ce67commit-bot@chromium.org 10886b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.orgGrGLProgramEffects* GrGLFragmentOnlyShaderBuilder::createAndEmitEffects( 10896b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org const GrEffectStage* effectStages[], 10906b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org const EffectKey effectKeys[], 10916b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org int effectCnt, 1092a34995e18b1f0a7d8c9f23451718bb30ff0105b0commit-bot@chromium.org GrGLSLExpr4* inOutFSColor) { 10936b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org 10940a6fe71f1bc0e601b41b7ae6d28b8c96a2c41116commit-bot@chromium.org GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, 10950a6fe71f1bc0e601b41b7ae6d28b8c96a2c41116commit-bot@chromium.org effectCnt); 10960a6fe71f1bc0e601b41b7ae6d28b8c96a2c41116commit-bot@chromium.org this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, 10976b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org effectStages, 10986b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org effectKeys, 10996b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org effectCnt, 1100824c346b6e0e114063c1a8ad4ba7c3a669ee2cffcommit-bot@chromium.org inOutFSColor); 11010a6fe71f1bc0e601b41b7ae6d28b8c96a2c41116commit-bot@chromium.org return pathTexGenEffectsBuilder.finish(); 11026b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org} 1103