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

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

Issue 367643004: Implement NVPR on GLES (Closed) Base URL: https://skia.googlesource.com/skia.git@02-path-program-fragment
Patch Set: Created 6 years, 6 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
Index: src/gpu/gl/GrGLUniformManager.h
diff --git a/src/gpu/gl/GrGLUniformManager.h b/src/gpu/gl/GrGLUniformManager.h
index 6137bcd9cc88806769b63cf1139feab103707d07..e7490beb654548eceb9da9ace57f64e247dc0bbf 100644
--- a/src/gpu/gl/GrGLUniformManager.h
+++ b/src/gpu/gl/GrGLUniformManager.h
@@ -17,35 +17,49 @@
class GrGpuGL;
class SkMatrix;
-/** Manages a program's uniforms.
+/** Manages a program's uniforms and other shader resources.
Kimmo Kinnunen 2014/07/01 13:01:21 I think this change sums up well the problem of th
*/
class GrGLUniformManager : public SkRefCnt {
public:
// Opaque handle to a uniform
- class UniformHandle {
+ class ShaderResourceHandle {
public:
- static UniformHandle CreateFromUniformIndex(int i);
-
bool isValid() const { return 0 != fValue; }
-
- bool operator==(const UniformHandle& other) const { return other.fValue == fValue; }
-
- UniformHandle()
+ ShaderResourceHandle()
: fValue(0) {
}
-
- private:
- UniformHandle(int value)
+ protected:
+ ShaderResourceHandle(int value)
: fValue(~value) {
SkASSERT(isValid());
}
+ int fValue;
+ };
+ class UniformHandle : public ShaderResourceHandle {
+ public:
+ static UniformHandle CreateFromUniformIndex(int i);
+ UniformHandle() { }
+ bool operator==(const UniformHandle& other) const { return other.fValue == fValue; }
+ private:
+ UniformHandle(int value) : ShaderResourceHandle(value) { }
int toUniformIndex() const { SkASSERT(isValid()); return ~fValue; }
-
- int fValue;
friend class GrGLUniformManager; // For accessing toUniformIndex().
};
+ class FragmentInputHandle : public ShaderResourceHandle {
+ public:
+ static FragmentInputHandle CreateFromFragmentInputIndex(int i) {
+ return FragmentInputHandle(i);
+ }
+ FragmentInputHandle() { }
+ bool operator==(const FragmentInputHandle& other) const { return other.fValue == fValue; }
+ private:
+ FragmentInputHandle(int value) : ShaderResourceHandle(value) { }
+ int toLocationIndex() const { SkASSERT(isValid()); return ~fValue; }
+ friend class GrGLUniformManager; // For accessing toLocationIndex().
+ };
+
GrGLUniformManager(GrGpuGL* gpu);
UniformHandle appendUniform(GrSLType type, int arrayCount = GrGLShaderVar::kNonArray);
@@ -72,6 +86,9 @@ public:
// convenience method for uploading a SkMatrix to a 3x3 matrix uniform
void setSkMatrix(UniformHandle, const SkMatrix&) const;
+ FragmentInputHandle appendFragmentInput();
+ void setFragmentInput(FragmentInputHandle i, size_t components, const SkMatrix& matrix) const;
+
struct BuilderUniform {
GrGLShaderVar fVariable;
uint32_t fVisibility;
@@ -81,17 +98,19 @@ public:
// name strings. Otherwise, we'd have to hand out copies.
typedef GrTAllocator<BuilderUniform> BuilderUniformArray;
+ typedef GrTAllocator<GrGLShaderVar> BuilderFragmentInputArray;
+
/**
- * Called by the GrGLShaderBuilder to know if the manager is using
- * BindUniformLocation. In that case getUniformLocations must be called
- * before the program is linked.
+ * Prepares the resolution of program resource locations.
+ * This is to be called before program is linked.
*/
- bool isUsingBindUniform() const { return fUsingBindUniform; }
+ void bindProgramResourceLocations(GrGLuint programID, const BuilderUniformArray& uniforms);
/**
- * Called by the GrGLShaderBuilder to get GL locations for all uniforms.
+ * Resolves the program resource locations.
+ * This is to be called after program is linked.
*/
- void getUniformLocations(GrGLuint programID, const BuilderUniformArray& uniforms);
+ void resolveProgramResourceLocations(GrGLuint programID, const BuilderUniformArray& uniforms, const BuilderFragmentInputArray& fragmentInputs);
/**
* Called by the GrGLShaderBuilder to access the array by the handle (index).
@@ -109,9 +128,13 @@ private:
GrSLType fType;
int fArrayCount;
};
+ struct FragmentInput {
+ GrGLint fLocation;
+ };
bool fUsingBindUniform;
SkTArray<Uniform, true> fUniforms;
+ SkTArray<FragmentInput, true> fFragmentInputs;
GrGpuGL* fGpu;
typedef SkRefCnt INHERITED;

Powered by Google App Engine
This is Rietveld 408576698