GrGLProgram.h revision fa8963252e122c5288c8e92b5ecc25a8fea21c3b
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 7f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 9f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#ifndef GrGLProgram_DEFINED 10f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#define GrGLProgram_DEFINED 11f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 126177e6999d23a4268ffd98dedfb1da00e272a89brobertphillips@google.com#include "GrGLContext.h" 1331ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com#include "GrGLProgramDesc.h" 14890e3b58e78c0825820f75f1f0c5a5d71e855aa6bsalomon@google.com#include "GrGLTexture.h" 157510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen#include "GrGLProgramDataManager.h" 16018fb62d12d1febf121fe265da5b6117b86a6541egdaniel#include "glsl/GrGLSLProgramDataManager.h" 177ea439b2203855db97330b25945b87dd4b170b8begdaniel#include "glsl/GrGLSLUniformHandler.h" 18f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 19f0a104e6f16dc095286d32f1e104894ae0b2b19fbsalomon@google.com#include "SkString.h" 2097c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h" 2197c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo 22d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt#include "builders/GrGLProgramBuilder.h" 23d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt 2447bb38283072dc87dc93220cd2f370ca109972ffjoshualittclass GrGLInstalledProcessors; 2530ba436f04e61d4505fb854d5fc56079636e0788joshualittclass GrGLProgramBuilder; 268dd688b7569df569a672a8a67b2db86a9d376cfcegdanielclass GrPipeline; 27f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 28f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/** 29f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This class manages a GPU program and records per-program information. 30f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * We can specify the attribute locations so that they are constant 31f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * across our shaders. But the driver determines the uniform locations 32f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * at link time. We don't need to remember the sampler uniform location 33f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * because we will bind a texture slot to it and never change it 34f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Uniforms are program-local so we can't rely on fHWState to hold the 35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * previous uniform state after a program change. 36f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 37a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.orgclass GrGLProgram : public SkRefCnt { 38f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic: 397ea439b2203855db97330b25945b87dd4b170b8begdaniel typedef GrGLSLProgramBuilder::BuiltinUniformHandles BuiltinUniformHandles; 40dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen 41d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt ~GrGLProgram(); 42f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 4334cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com /** 4434cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com * Call to abandon GL objects owned by this program. 4534cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com */ 46ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com void abandon(); 47ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com 4879f8faeea2692d2948c0f634e956d1e7fc8333e0joshualitt const GrProgramDesc& getDesc() { return fDesc; } 499ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 50271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com /** 516a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com * Gets the GL program ID for this program. 526a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com */ 53dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen GrGLuint programID() const { return fProgramID; } 546a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com 556a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com /** 56ee2af95db72152dfa61c841875df0594ca93437djoshualitt * We use the RT's size and origin to adjust from Skia device space to OpenGL normalized device 57ee2af95db72152dfa61c841875df0594ca93437djoshualitt * space and to make device space positions have the correct origin for processors that require 58ee2af95db72152dfa61c841875df0594ca93437djoshualitt * them. 596a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com */ 60ee2af95db72152dfa61c841875df0594ca93437djoshualitt struct RenderTargetState { 616a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com SkISize fRenderTargetSize; 626a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com GrSurfaceOrigin fRenderTargetOrigin; 636a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com 64ee2af95db72152dfa61c841875df0594ca93437djoshualitt RenderTargetState() { this->invalidate(); } 656a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com void invalidate() { 6645a412ee365694c61b50f6177382b509d1e2462bbsalomon@google.com fRenderTargetSize.fWidth = -1; 6745a412ee365694c61b50f6177382b509d1e2462bbsalomon@google.com fRenderTargetSize.fHeight = -1; 686a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com fRenderTargetOrigin = (GrSurfaceOrigin) -1; 696a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com } 7047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org 7147c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org /** 7247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org * Gets a vec4 that adjusts the position from Skia device coords to GL's normalized device 7347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org * coords. Assuming the transformed position, pos, is a homogeneous vec3, the vec, v, is 7447c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org * applied as such: 7547c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org * pos.x = dot(v.xy, pos.xz) 76ef4ba3da0b1fe375b9631bcd17c43c645f4aa5a6robertphillips * pos.y = dot(v.zw, pos.yz) 7747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org */ 78018fb62d12d1febf121fe265da5b6117b86a6541egdaniel void getRTAdjustmentVec(float* destVec) { 7947c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[0] = 2.f / fRenderTargetSize.fWidth; 8047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[1] = -1.f; 8147c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) { 8247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[2] = -2.f / fRenderTargetSize.fHeight; 8347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[3] = 1.f; 8447c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org } else { 8547c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[2] = 2.f / fRenderTargetSize.fHeight; 8647c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[3] = -1.f; 8747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org } 8847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org } 896a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com }; 906a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com 916a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com /** 927dc4bd06fca73a97dcf3ad4a7425597160f1edfcegdaniel * This function uploads uniforms, calls each GrGL*Processor's setData, and retrieves the 934271765d110be2661562f30f47addc9cb69ca4c7cdalton * textures that need to be bound on each unit. It is the caller's responsibility to ensure 944271765d110be2661562f30f47addc9cb69ca4c7cdalton * the program is bound before calling, and to bind the outgoing textures to their respective 954271765d110be2661562f30f47addc9cb69ca4c7cdalton * units upon return. (Each index in the array corresponds to its matching GL texture unit.) 964285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com */ 97465283cdf98ed9ab5285ca7b9814e430fca1d452joshualitt void setData(const GrPrimitiveProcessor&, const GrPipeline&, 984271765d110be2661562f30f47addc9cb69ca4c7cdalton SkTArray<const GrTextureAccess*>* textureBindings); 999196130af83782fcac4334117142475a837dd74dbsalomon@google.com 10047bb38283072dc87dc93220cd2f370ca109972ffjoshualittprotected: 101018fb62d12d1febf121fe265da5b6117b86a6541egdaniel typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; 10247bb38283072dc87dc93220cd2f370ca109972ffjoshualitt typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray; 1030eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel typedef GrGLProgramDataManager::VaryingInfoArray VaryingInfoArray; 104dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 105861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon GrGLProgram(GrGLGpu*, 10679f8faeea2692d2948c0f634e956d1e7fc8333e0joshualitt const GrProgramDesc&, 10747bb38283072dc87dc93220cd2f370ca109972ffjoshualitt const BuiltinUniformHandles&, 10847bb38283072dc87dc93220cd2f370ca109972ffjoshualitt GrGLuint programID, 10947bb38283072dc87dc93220cd2f370ca109972ffjoshualitt const UniformInfoArray&, 1100eafe79f42e3c675f3c504aed4a41abf511df2b7egdaniel const VaryingInfoArray&, // used for NVPR only currently 111fa8963252e122c5288c8e92b5ecc25a8fea21c3begdaniel GrGLSLPrimitiveProcessor* geometryProcessor, 112fa8963252e122c5288c8e92b5ecc25a8fea21c3begdaniel GrGLSLXferProcessor* xferProcessor, 113fa8963252e122c5288c8e92b5ecc25a8fea21c3begdaniel const GrGLSLFragProcs& fragmentProcessors, 1144271765d110be2661562f30f47addc9cb69ca4c7cdalton SkTArray<UniformHandle>* passSamplerUniforms); 1152c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com 11647bb38283072dc87dc93220cd2f370ca109972ffjoshualitt // A templated helper to loop over effects, set the transforms(via subclass) and bind textures 1174271765d110be2661562f30f47addc9cb69ca4c7cdalton void setFragmentData(const GrPrimitiveProcessor&, const GrPipeline&, 1184271765d110be2661562f30f47addc9cb69ca4c7cdalton SkTArray<const GrTextureAccess*>* textureBindings); 119d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt void setTransformData(const GrPrimitiveProcessor&, 120d8dd47b5fa52430a1ab5c07335c0c13fcd43a82djoshualitt const GrFragmentProcessor&, 121fa8963252e122c5288c8e92b5ecc25a8fea21c3begdaniel int index); 12247bb38283072dc87dc93220cd2f370ca109972ffjoshualitt 1232c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com // Helper for setData() that sets the view matrix and loads the render target height uniform 1248dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel void setRenderTargetState(const GrPrimitiveProcessor&, const GrPipeline&); 1252c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com 12634cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com // these reflect the current values of uniforms (GL uniform values travel with program) 127ee2af95db72152dfa61c841875df0594ca93437djoshualitt RenderTargetState fRenderTargetState; 12847bb38283072dc87dc93220cd2f370ca109972ffjoshualitt BuiltinUniformHandles fBuiltinUniformHandles; 12947bb38283072dc87dc93220cd2f370ca109972ffjoshualitt GrGLuint fProgramID; 1306eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org 13147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt // the installed effects 132fa8963252e122c5288c8e92b5ecc25a8fea21c3begdaniel SkAutoTDelete<GrGLSLPrimitiveProcessor> fGeometryProcessor; 133fa8963252e122c5288c8e92b5ecc25a8fea21c3begdaniel SkAutoTDelete<GrGLSLXferProcessor> fXferProcessor; 134fa8963252e122c5288c8e92b5ecc25a8fea21c3begdaniel GrGLSLFragProcs fFragmentProcessors; 1359681eebb0e441cee25b6faac82c3728512acda27skia.committer@gmail.com 13679f8faeea2692d2948c0f634e956d1e7fc8333e0joshualitt GrProgramDesc fDesc; 137861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon GrGLGpu* fGpu; 13847bb38283072dc87dc93220cd2f370ca109972ffjoshualitt GrGLProgramDataManager fProgramDataManager; 1394271765d110be2661562f30f47addc9cb69ca4c7cdalton SkTArray<UniformHandle> fSamplerUniforms; 1406eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org 14147bb38283072dc87dc93220cd2f370ca109972ffjoshualitt friend class GrGLProgramBuilder; 1426b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org 143a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org typedef SkRefCnt INHERITED; 144f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com}; 145f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 146f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#endif 147