Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Unified Diff: src/gpu/gl/GrGLProgramEffects.h

Issue 25605008: Repurpose GrGLCoordTransform as GrGLEffectArray (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/gl/GrGLProgram.cpp ('k') | src/gpu/gl/GrGLProgramEffects.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/gl/GrGLProgramEffects.h
diff --git a/src/gpu/gl/GrGLProgramEffects.h b/src/gpu/gl/GrGLProgramEffects.h
new file mode 100644
index 0000000000000000000000000000000000000000..c2c21042b08d9ac153ac2f52be3b9ec3333b5542
--- /dev/null
+++ b/src/gpu/gl/GrGLProgramEffects.h
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrGLProgramEffects_DEFINED
+#define GrGLProgramEffects_DEFINED
+
+#include "GrBackendEffectFactory.h"
+#include "GrTexture.h"
+#include "GrTextureAccess.h"
+#include "GrGLUniformManager.h"
+
+class GrEffectStage;
+class GrGLProgramEffectsBuilder;
+class GrGLShaderBuilder;
+
+/**
+ * This class encapsulates an array of GrGLEffects and their supporting data (coord transforms
+ * and textures). It is built with GrGLProgramEffectsBuilder, then used to manage the necessary GL
+ * state and shader uniforms.
+ */
+class GrGLProgramEffects {
+public:
+ typedef GrBackendEffectFactory::EffectKey EffectKey;
+ typedef GrGLUniformManager::UniformHandle UniformHandle;
+
+ /**
+ * These methods generate different portions of an effect's final key.
+ */
+ static EffectKey GenAttribKey(const GrDrawEffect&);
+ static EffectKey GenTransformKey(const GrDrawEffect&);
+ static EffectKey GenTextureKey(const GrDrawEffect&, const GrGLCaps&);
+
+ ~GrGLProgramEffects();
+
+ /**
+ * Assigns a texture unit to each sampler. It starts on *texUnitIdx and writes the next
+ * available unit to *texUnitIdx when it returns.
+ */
+ void initSamplers(const GrGLUniformManager&, int* texUnitIdx);
+
+ /**
+ * Calls setData() on each effect, and sets their transformation matrices and texture bindings.
+ */
+ void setData(GrGpuGL*,
+ const GrGLUniformManager&,
+ const GrEffectStage* effectStages[]);
+
+ /**
+ * Passed to GrGLEffects so they can add transformed coordinates to their shader code.
+ */
+ class TransformedCoords {
+ public:
+ TransformedCoords(const char* name, GrSLType type, const char* vsName)
+ : fName(name), fType(type), fVSName(vsName) {
+ }
+
+ const char* c_str() const { return fName.c_str(); }
+ GrSLType type() const { return fType; }
+ const SkString& getName() const { return fName; }
+ // TODO: Remove the VS name when we have vertexless shaders, and gradients are reworked.
+ const SkString& getVSName() const { return fVSName; }
+
+ private:
+ SkString fName;
+ GrSLType fType;
+ SkString fVSName;
+ };
+
+ typedef SkTArray<TransformedCoords> TransformedCoordsArray;
+
+ /**
+ * Passed to GrGLEffects so they can add texture reads to their shader code.
+ */
+ class TextureSampler {
+ public:
+ TextureSampler(UniformHandle uniform, const GrTextureAccess& access)
+ : fSamplerUniform(uniform)
+ , fConfigComponentMask(GrPixelConfigComponentMask(access.getTexture()->config())) {
+ SkASSERT(0 != fConfigComponentMask);
+ memcpy(fSwizzle, access.getSwizzle(), 5);
+ }
+
+ UniformHandle samplerUniform() const { return fSamplerUniform; }
+ // bitfield of GrColorComponentFlags present in the texture's config.
+ uint32_t configComponentMask() const { return fConfigComponentMask; }
+ const char* swizzle() const { return fSwizzle; }
+
+ private:
+ UniformHandle fSamplerUniform;
+ uint32_t fConfigComponentMask;
+ char fSwizzle[5];
+ };
+
+ typedef SkTArray<TextureSampler> TextureSamplerArray;
+
+private:
+ friend class GrGLProgramEffectsBuilder;
+
+ GrGLProgramEffects(int reserveCount, bool explicitLocalCoords)
+ : fGLEffects(reserveCount)
+ , fTransforms(reserveCount)
+ , fSamplers(reserveCount)
+ , fHasExplicitLocalCoords(explicitLocalCoords) {
+ }
+
+ /**
+ * Helper for setData(). Sets all the transform matrices for an effect.
+ */
+ void setTransformData(const GrGLUniformManager&, const GrDrawEffect&, int effectIdx);
+
+ /**
+ * Helper for setData(). Binds all the textures for an effect.
+ */
+ void bindTextures(GrGpuGL*, const GrEffectRef&, int effectIdx);
+
+ struct Transform {
+ Transform() { fCurrentValue = SkMatrix::InvalidMatrix(); }
+ UniformHandle fHandle;
+ GrSLType fType;
+ SkMatrix fCurrentValue;
+ };
+
+ struct Sampler {
+ SkDEBUGCODE(Sampler() : fTextureUnit(-1) {})
+ UniformHandle fUniform;
+ int fTextureUnit;
+ };
+
+ SkTArray<GrGLEffect*> fGLEffects;
+ SkTArray<SkSTArray<2, Transform, true> > fTransforms;
+ SkTArray<SkSTArray<4, Sampler, true> > fSamplers;
+ bool fHasExplicitLocalCoords;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * This class is used to construct a GrGLProgramEffects.
+ */
+class GrGLProgramEffectsBuilder {
+public:
+ GrGLProgramEffectsBuilder(GrGLShaderBuilder* builder, int reserveCount);
+
+ /**
+ * Emits the effect's shader code, and stores the necessary uniforms internally.
+ */
+ void emitEffect(const GrEffectStage&,
+ GrGLProgramEffects::EffectKey,
+ const char* outColor,
+ const char* inColor,
+ int stageIndex);
+
+ /**
+ * Finalizes the building process and returns the effect array. After this call, the builder
+ * becomes invalid.
+ */
+ GrGLProgramEffects* finish() { return fProgramEffects.detach(); }
+
+private:
+ /**
+ * Helper for emitEffect(). Emits any attributes an effect might have.
+ */
+ void emitAttributes(const GrEffectStage&);
+
+ /**
+ * Helper for emitEffect(). Emits code to implement an effect's coord transforms in the VS.
+ * Varyings are added as an outputs of the VS and inputs to the FS. The varyings may be either a
+ * vec2f or vec3f depending upon whether perspective interpolation is required or not. The names
+ * of the varyings in the VS and FS as well their types are appended to the
+ * TransformedCoordsArray* object, which is in turn passed to the effect's emitCode() function.
+ */
+ void emitTransforms(const GrEffectRef&,
+ GrGLProgramEffects::EffectKey,
+ GrGLProgramEffects::TransformedCoordsArray*);
+
+ /**
+ * Helper for emitEffect(). Emits uniforms for an effect's texture accesses. The uniform info
+ * as well as texture access parameters are appended to the TextureSamplerArray* object, which
+ * is in turn passed to the effect's emitCode() function.
+ */
+ void emitSamplers(const GrEffectRef&,
+ GrGLProgramEffects::TextureSamplerArray*);
+
+ GrGLShaderBuilder* fBuilder;
+ SkAutoTDelete<GrGLProgramEffects> fProgramEffects;
+};
+
+#endif
« no previous file with comments | « src/gpu/gl/GrGLProgram.cpp ('k') | src/gpu/gl/GrGLProgramEffects.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698