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

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

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.cpp
diff --git a/src/gpu/gl/GrGLUniformManager.cpp b/src/gpu/gl/GrGLUniformManager.cpp
index 29679aa409a4c07308fb972f53a45fe268eb8d6b..c4121f15ddc807674929131ffda5a43b5c64b411 100644
--- a/src/gpu/gl/GrGLUniformManager.cpp
+++ b/src/gpu/gl/GrGLUniformManager.cpp
@@ -248,28 +248,89 @@ void GrGLUniformManager::setSkMatrix(UniformHandle u, const SkMatrix& matrix) co
this->setMatrix3f(u, mt);
}
+void GrGLUniformManager::setFragmentInput(FragmentInputHandle i, size_t components, const SkMatrix& matrix) const {
+ const FragmentInput& fragmentInput = fFragmentInputs[i.toLocationIndex()];
-void GrGLUniformManager::getUniformLocations(GrGLuint programID, const BuilderUniformArray& uniforms) {
+ GrGLfloat coefficients[3 * 3];
+ SkASSERT(components >= 1 && components <= 3);
+
+ coefficients[0] = SkScalarToFloat(matrix[SkMatrix::kMScaleX]);
+ coefficients[1] = SkScalarToFloat(matrix[SkMatrix::kMSkewX]);
+ coefficients[2] = SkScalarToFloat(matrix[SkMatrix::kMTransX]);
+
+ if (components >= 2) {
+ coefficients[3] = SkScalarToFloat(matrix[SkMatrix::kMSkewY]);
+ coefficients[4] = SkScalarToFloat(matrix[SkMatrix::kMScaleY]);
+ coefficients[5] = SkScalarToFloat(matrix[SkMatrix::kMTransY]);
+ }
+
+ if (components >= 3) {
+ coefficients[6] = SkScalarToFloat(matrix[SkMatrix::kMPersp0]);
+ coefficients[7] = SkScalarToFloat(matrix[SkMatrix::kMPersp1]);
+ coefficients[8] = SkScalarToFloat(matrix[SkMatrix::kMPersp2]);
+ }
+ fGpu->setProgramPathFragmentInputGen(fragmentInput.fLocation, components, coefficients);
+}
+
+
+void GrGLUniformManager::bindProgramResourceLocations(
+ GrGLuint programID,
+ const BuilderUniformArray& uniforms) {
+ if (!fUsingBindUniform) {
+ return;
+ }
SkASSERT(uniforms.count() == fUniforms.count());
int count = fUniforms.count();
for (int i = 0; i < count; ++i) {
SkASSERT(uniforms[i].fVariable.getType() == fUniforms[i].fType);
SkASSERT(uniforms[i].fVariable.getArrayCount() == fUniforms[i].fArrayCount);
- GrGLint location;
// TODO: Move the Xoom uniform array in both FS and VS bug workaround here.
- if (fUsingBindUniform) {
- location = i;
- GR_GL_CALL(fGpu->glInterface(),
- BindUniformLocation(programID, location, uniforms[i].fVariable.c_str()));
- } else {
- GR_GL_CALL_RET(fGpu->glInterface(), location,
- GetUniformLocation(programID, uniforms[i].fVariable.c_str()));
- }
+
+ GR_GL_CALL(fGpu->glInterface(),
+ BindUniformLocation(programID, i, uniforms[i].fVariable.c_str()));
if (GrGLShaderBuilder::kVertex_Visibility & uniforms[i].fVisibility) {
- fUniforms[i].fVSLocation = location;
+ fUniforms[i].fVSLocation = i;
}
if (GrGLShaderBuilder::kFragment_Visibility & uniforms[i].fVisibility) {
- fUniforms[i].fFSLocation = location;
+ fUniforms[i].fFSLocation = i;
+ }
+ }
+}
+
+void GrGLUniformManager::resolveProgramResourceLocations(
+ GrGLuint programID,
+ const BuilderUniformArray& uniforms,
+ const BuilderFragmentInputArray& fragmentInputs) {
+ if (!fUsingBindUniform) {
+ SkASSERT(uniforms.count() == fUniforms.count());
+ int count = fUniforms.count();
+ for (int i = 0; i < count; ++i) {
+ SkASSERT(uniforms[i].fVariable.getType() == fUniforms[i].fType);
+ SkASSERT(uniforms[i].fVariable.getArrayCount() == fUniforms[i].fArrayCount);
+ GrGLint location;
+ // TODO: Move the Xoom uniform array in both FS and VS bug workaround here.
+ GR_GL_CALL_RET(fGpu->glInterface(), location,
+ GetUniformLocation(programID, uniforms[i].fVariable.c_str()));
+
+ if (GrGLShaderBuilder::kVertex_Visibility & uniforms[i].fVisibility) {
+ fUniforms[i].fVSLocation = location;
+ }
+ if (GrGLShaderBuilder::kFragment_Visibility & uniforms[i].fVisibility) {
+ fUniforms[i].fFSLocation = location;
+ }
+ }
+ }
+
+ if (fGpu->glCaps().pathRenderingSupport()) {
+ int count = fFragmentInputs.count();
+ SkASSERT(fragmentInputs.count() == fFragmentInputs.count());
+ for (int i = 0; i < count; ++i) {
+ GrGLint location;
+ GR_GL_CALL_RET(fGpu->glInterface(), location,
+ GetProgramResourceLocation(programID,
+ GR_GL_FRAGMENT_INPUT,
+ fragmentInputs[i].c_str()));
+ fFragmentInputs[i].fLocation = location;
}
}
}
@@ -278,3 +339,9 @@ const GrGLUniformManager::BuilderUniform&
GrGLUniformManager::getBuilderUniform(const BuilderUniformArray& array, UniformHandle handle) const {
return array[handle.toUniformIndex()];
}
+
+GrGLUniformManager::FragmentInputHandle GrGLUniformManager::appendFragmentInput() {
+ int idx = fFragmentInputs.count();
+ fFragmentInputs.push_back();
+ return FragmentInputHandle::CreateFromFragmentInputIndex(idx);
+}

Powered by Google App Engine
This is Rietveld 408576698