| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrGLGpu.h" | 8 #include "GrGLGpu.h" |
| 9 #include "GrGLGLSL.h" | 9 #include "GrGLGLSL.h" |
| 10 #include "GrGLStencilAttachment.h" | 10 #include "GrGLStencilAttachment.h" |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 } | 278 } |
| 279 | 279 |
| 280 if (0 != fPLSSetupProgram.fProgram) { | 280 if (0 != fPLSSetupProgram.fProgram) { |
| 281 GL_CALL(DeleteProgram(fPLSSetupProgram.fProgram)); | 281 GL_CALL(DeleteProgram(fPLSSetupProgram.fProgram)); |
| 282 } | 282 } |
| 283 | 283 |
| 284 delete fProgramCache; | 284 delete fProgramCache; |
| 285 } | 285 } |
| 286 | 286 |
| 287 void GrGLGpu::createPLSSetupProgram() { | 287 void GrGLGpu::createPLSSetupProgram() { |
| 288 const char* version = this->glCaps().glslCaps()->versionDeclString(); | 288 const GrGLSLCaps* glslCaps = this->glCaps().glslCaps(); |
| 289 const char* version = glslCaps->versionDeclString(); |
| 289 | 290 |
| 290 GrGLSLShaderVar aVertex("a_vertex", kVec2f_GrSLType, GrShaderVar::kAttribute
_TypeModifier); | 291 GrGLSLShaderVar aVertex("a_vertex", kVec2f_GrSLType, GrShaderVar::kAttribute
_TypeModifier); |
| 291 GrGLSLShaderVar uTexCoordXform("u_texCoordXform", kVec4f_GrSLType, | 292 GrGLSLShaderVar uTexCoordXform("u_texCoordXform", kVec4f_GrSLType, |
| 292 GrShaderVar::kUniform_TypeModifier); | 293 GrShaderVar::kUniform_TypeModifier); |
| 293 GrGLSLShaderVar uPosXform("u_posXform", kVec4f_GrSLType, GrShaderVar::kUnifo
rm_TypeModifier); | 294 GrGLSLShaderVar uPosXform("u_posXform", kVec4f_GrSLType, GrShaderVar::kUnifo
rm_TypeModifier); |
| 294 GrGLSLShaderVar uTexture("u_texture", kSampler2D_GrSLType, GrShaderVar::kUni
form_TypeModifier); | 295 GrGLSLShaderVar uTexture("u_texture", kSampler2D_GrSLType, GrShaderVar::kUni
form_TypeModifier); |
| 295 GrGLSLShaderVar vTexCoord("v_texCoord", kVec2f_GrSLType, GrShaderVar::kVaryi
ngOut_TypeModifier); | 296 GrGLSLShaderVar vTexCoord("v_texCoord", kVec2f_GrSLType, GrShaderVar::kVaryi
ngOut_TypeModifier); |
| 296 | 297 |
| 297 SkString vshaderTxt(version); | 298 SkString vshaderTxt(version); |
| 298 aVertex.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 299 if (glslCaps->noperspectiveInterpolationSupport()) { |
| 300 if (const char* extension = glslCaps->noperspectiveInterpolationExtensio
nString()) { |
| 301 vshaderTxt.appendf("#extension %s : require\n", extension); |
| 302 } |
| 303 vTexCoord.addModifier("noperspective"); |
| 304 } |
| 305 aVertex.appendDecl(glslCaps, &vshaderTxt); |
| 299 vshaderTxt.append(";"); | 306 vshaderTxt.append(";"); |
| 300 uTexCoordXform.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 307 uTexCoordXform.appendDecl(glslCaps, &vshaderTxt); |
| 301 vshaderTxt.append(";"); | 308 vshaderTxt.append(";"); |
| 302 uPosXform.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 309 uPosXform.appendDecl(glslCaps, &vshaderTxt); |
| 303 vshaderTxt.append(";"); | 310 vshaderTxt.append(";"); |
| 304 vTexCoord.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 311 vTexCoord.appendDecl(glslCaps, &vshaderTxt); |
| 305 vshaderTxt.append(";"); | 312 vshaderTxt.append(";"); |
| 306 | 313 |
| 307 vshaderTxt.append( | 314 vshaderTxt.append( |
| 308 "// PLS Setup Program VS\n" | 315 "// PLS Setup Program VS\n" |
| 309 "void main() {" | 316 "void main() {" |
| 310 " gl_Position.xy = a_vertex * u_posXform.xy + u_posXform.zw;" | 317 " gl_Position.xy = a_vertex * u_posXform.xy + u_posXform.zw;" |
| 311 " gl_Position.zw = vec2(0, 1);" | 318 " gl_Position.zw = vec2(0, 1);" |
| 312 "}" | 319 "}" |
| 313 ); | 320 ); |
| 314 | 321 |
| 315 SkString fshaderTxt(version); | 322 SkString fshaderTxt(version); |
| 323 if (glslCaps->noperspectiveInterpolationSupport()) { |
| 324 if (const char* extension = glslCaps->noperspectiveInterpolationExtensio
nString()) { |
| 325 fshaderTxt.appendf("#extension %s : require\n", extension); |
| 326 } |
| 327 } |
| 316 fshaderTxt.append("#extension "); | 328 fshaderTxt.append("#extension "); |
| 317 fshaderTxt.append(this->glCaps().glslCaps()->fbFetchExtensionString()); | 329 fshaderTxt.append(glslCaps->fbFetchExtensionString()); |
| 318 fshaderTxt.append(" : require\n"); | 330 fshaderTxt.append(" : require\n"); |
| 319 fshaderTxt.append("#extension GL_EXT_shader_pixel_local_storage : require\n"
); | 331 fshaderTxt.append("#extension GL_EXT_shader_pixel_local_storage : require\n"
); |
| 320 GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, | 332 GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, *glslCa
ps, &fshaderTxt); |
| 321 *this->glCaps().glslCaps(), | |
| 322 &fshaderTxt); | |
| 323 vTexCoord.setTypeModifier(GrShaderVar::kVaryingIn_TypeModifier); | 333 vTexCoord.setTypeModifier(GrShaderVar::kVaryingIn_TypeModifier); |
| 324 vTexCoord.appendDecl(this->glCaps().glslCaps(), &fshaderTxt); | 334 vTexCoord.appendDecl(glslCaps, &fshaderTxt); |
| 325 fshaderTxt.append(";"); | 335 fshaderTxt.append(";"); |
| 326 uTexture.appendDecl(this->glCaps().glslCaps(), &fshaderTxt); | 336 uTexture.appendDecl(glslCaps, &fshaderTxt); |
| 327 fshaderTxt.append(";"); | 337 fshaderTxt.append(";"); |
| 328 | 338 |
| 329 fshaderTxt.appendf( | 339 fshaderTxt.appendf( |
| 330 "// PLS Setup Program FS\n" | 340 "// PLS Setup Program FS\n" |
| 331 GR_GL_PLS_PATH_DATA_DECL | 341 GR_GL_PLS_PATH_DATA_DECL |
| 332 "void main() {\n" | 342 "void main() {\n" |
| 333 " " GR_GL_PLS_DSTCOLOR_NAME " = gl_LastFragColorARM;\n" | 343 " " GR_GL_PLS_DSTCOLOR_NAME " = gl_LastFragColorARM;\n" |
| 334 " pls.windings = ivec4(0, 0, 0, 0);\n" | 344 " pls.windings = ivec4(0, 0, 0, 0);\n" |
| 335 "}" | 345 "}" |
| 336 ); | 346 ); |
| (...skipping 2879 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3216 return this->copySurfaceAsBlitFramebuffer(dst, src, srcRect, dstPoint); | 3226 return this->copySurfaceAsBlitFramebuffer(dst, src, srcRect, dstPoint); |
| 3217 } | 3227 } |
| 3218 | 3228 |
| 3219 return false; | 3229 return false; |
| 3220 } | 3230 } |
| 3221 | 3231 |
| 3222 void GrGLGpu::createCopyPrograms() { | 3232 void GrGLGpu::createCopyPrograms() { |
| 3223 for (size_t i = 0; i < SK_ARRAY_COUNT(fCopyPrograms); ++i) { | 3233 for (size_t i = 0; i < SK_ARRAY_COUNT(fCopyPrograms); ++i) { |
| 3224 fCopyPrograms[i].fProgram = 0; | 3234 fCopyPrograms[i].fProgram = 0; |
| 3225 } | 3235 } |
| 3226 const char* version = this->glCaps().glslCaps()->versionDeclString(); | 3236 const GrGLSLCaps* glslCaps = this->glCaps().glslCaps(); |
| 3237 const char* version = glslCaps->versionDeclString(); |
| 3227 static const GrSLType kSamplerTypes[3] = { kSampler2D_GrSLType, kSamplerExte
rnal_GrSLType, | 3238 static const GrSLType kSamplerTypes[3] = { kSampler2D_GrSLType, kSamplerExte
rnal_GrSLType, |
| 3228 kSampler2DRect_GrSLType }; | 3239 kSampler2DRect_GrSLType }; |
| 3229 SkASSERT(3 == SK_ARRAY_COUNT(fCopyPrograms)); | 3240 SkASSERT(3 == SK_ARRAY_COUNT(fCopyPrograms)); |
| 3230 for (int i = 0; i < 3; ++i) { | 3241 for (int i = 0; i < 3; ++i) { |
| 3231 if (kSamplerExternal_GrSLType == kSamplerTypes[i] && | 3242 if (kSamplerExternal_GrSLType == kSamplerTypes[i] && |
| 3232 !this->glCaps().externalTextureSupport()) { | 3243 !this->glCaps().externalTextureSupport()) { |
| 3233 continue; | 3244 continue; |
| 3234 } | 3245 } |
| 3235 if (kSampler2DRect_GrSLType == kSamplerTypes[i] && | 3246 if (kSampler2DRect_GrSLType == kSamplerTypes[i] && |
| 3236 !this->glCaps().rectangleTextureSupport()) { | 3247 !this->glCaps().rectangleTextureSupport()) { |
| 3237 continue; | 3248 continue; |
| 3238 } | 3249 } |
| 3239 GrGLSLShaderVar aVertex("a_vertex", kVec2f_GrSLType, GrShaderVar::kAttri
bute_TypeModifier); | 3250 GrGLSLShaderVar aVertex("a_vertex", kVec2f_GrSLType, GrShaderVar::kAttri
bute_TypeModifier); |
| 3240 GrGLSLShaderVar uTexCoordXform("u_texCoordXform", kVec4f_GrSLType, | 3251 GrGLSLShaderVar uTexCoordXform("u_texCoordXform", kVec4f_GrSLType, |
| 3241 GrShaderVar::kUniform_TypeModifier); | 3252 GrShaderVar::kUniform_TypeModifier); |
| 3242 GrGLSLShaderVar uPosXform("u_posXform", kVec4f_GrSLType, | 3253 GrGLSLShaderVar uPosXform("u_posXform", kVec4f_GrSLType, |
| 3243 GrShaderVar::kUniform_TypeModifier); | 3254 GrShaderVar::kUniform_TypeModifier); |
| 3244 GrGLSLShaderVar uTexture("u_texture", kSamplerTypes[i], | 3255 GrGLSLShaderVar uTexture("u_texture", kSamplerTypes[i], |
| 3245 GrShaderVar::kUniform_TypeModifier); | 3256 GrShaderVar::kUniform_TypeModifier); |
| 3246 GrGLSLShaderVar vTexCoord("v_texCoord", kVec2f_GrSLType, | 3257 GrGLSLShaderVar vTexCoord("v_texCoord", kVec2f_GrSLType, |
| 3247 GrShaderVar::kVaryingOut_TypeModifier); | 3258 GrShaderVar::kVaryingOut_TypeModifier); |
| 3248 GrGLSLShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, | 3259 GrGLSLShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, |
| 3249 GrShaderVar::kOut_TypeModifier); | 3260 GrShaderVar::kOut_TypeModifier); |
| 3250 | 3261 |
| 3251 SkString vshaderTxt(version); | 3262 SkString vshaderTxt(version); |
| 3252 aVertex.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 3263 if (glslCaps->noperspectiveInterpolationSupport()) { |
| 3264 if (const char* extension = glslCaps->noperspectiveInterpolationExte
nsionString()) { |
| 3265 vshaderTxt.appendf("#extension %s : require\n", extension); |
| 3266 } |
| 3267 vTexCoord.addModifier("noperspective"); |
| 3268 } |
| 3269 |
| 3270 aVertex.appendDecl(glslCaps, &vshaderTxt); |
| 3253 vshaderTxt.append(";"); | 3271 vshaderTxt.append(";"); |
| 3254 uTexCoordXform.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 3272 uTexCoordXform.appendDecl(glslCaps, &vshaderTxt); |
| 3255 vshaderTxt.append(";"); | 3273 vshaderTxt.append(";"); |
| 3256 uPosXform.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 3274 uPosXform.appendDecl(glslCaps, &vshaderTxt); |
| 3257 vshaderTxt.append(";"); | 3275 vshaderTxt.append(";"); |
| 3258 vTexCoord.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 3276 vTexCoord.appendDecl(glslCaps, &vshaderTxt); |
| 3259 vshaderTxt.append(";"); | 3277 vshaderTxt.append(";"); |
| 3260 | 3278 |
| 3261 vshaderTxt.append( | 3279 vshaderTxt.append( |
| 3262 "// Copy Program VS\n" | 3280 "// Copy Program VS\n" |
| 3263 "void main() {" | 3281 "void main() {" |
| 3264 " v_texCoord = a_vertex.xy * u_texCoordXform.xy + u_texCoordXform.z
w;" | 3282 " v_texCoord = a_vertex.xy * u_texCoordXform.xy + u_texCoordXform.z
w;" |
| 3265 " gl_Position.xy = a_vertex * u_posXform.xy + u_posXform.zw;" | 3283 " gl_Position.xy = a_vertex * u_posXform.xy + u_posXform.zw;" |
| 3266 " gl_Position.zw = vec2(0, 1);" | 3284 " gl_Position.zw = vec2(0, 1);" |
| 3267 "}" | 3285 "}" |
| 3268 ); | 3286 ); |
| 3269 | 3287 |
| 3270 SkString fshaderTxt(version); | 3288 SkString fshaderTxt(version); |
| 3289 if (glslCaps->noperspectiveInterpolationSupport()) { |
| 3290 if (const char* extension = glslCaps->noperspectiveInterpolationExte
nsionString()) { |
| 3291 fshaderTxt.appendf("#extension %s : require\n", extension); |
| 3292 } |
| 3293 } |
| 3271 if (kSamplerTypes[i] == kSamplerExternal_GrSLType) { | 3294 if (kSamplerTypes[i] == kSamplerExternal_GrSLType) { |
| 3272 fshaderTxt.appendf("#extension %s : require\n", | 3295 fshaderTxt.appendf("#extension %s : require\n", |
| 3273 this->glCaps().glslCaps()->externalTextureExtensi
onString()); | 3296 glslCaps->externalTextureExtensionString()); |
| 3274 } | 3297 } |
| 3275 GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, | 3298 GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, *gl
slCaps, |
| 3276 *this->glCaps().glslCaps(), | |
| 3277 &fshaderTxt); | 3299 &fshaderTxt); |
| 3278 vTexCoord.setTypeModifier(GrShaderVar::kVaryingIn_TypeModifier); | 3300 vTexCoord.setTypeModifier(GrShaderVar::kVaryingIn_TypeModifier); |
| 3279 vTexCoord.appendDecl(this->glCaps().glslCaps(), &fshaderTxt); | 3301 vTexCoord.appendDecl(glslCaps, &fshaderTxt); |
| 3280 fshaderTxt.append(";"); | 3302 fshaderTxt.append(";"); |
| 3281 uTexture.appendDecl(this->glCaps().glslCaps(), &fshaderTxt); | 3303 uTexture.appendDecl(glslCaps, &fshaderTxt); |
| 3282 fshaderTxt.append(";"); | 3304 fshaderTxt.append(";"); |
| 3283 const char* fsOutName; | 3305 const char* fsOutName; |
| 3284 if (this->glCaps().glslCaps()->mustDeclareFragmentShaderOutput()) { | 3306 if (glslCaps->mustDeclareFragmentShaderOutput()) { |
| 3285 oFragColor.appendDecl(this->glCaps().glslCaps(), &fshaderTxt); | 3307 oFragColor.appendDecl(glslCaps, &fshaderTxt); |
| 3286 fshaderTxt.append(";"); | 3308 fshaderTxt.append(";"); |
| 3287 fsOutName = oFragColor.c_str(); | 3309 fsOutName = oFragColor.c_str(); |
| 3288 } else { | 3310 } else { |
| 3289 fsOutName = "gl_FragColor"; | 3311 fsOutName = "gl_FragColor"; |
| 3290 } | 3312 } |
| 3291 fshaderTxt.appendf( | 3313 fshaderTxt.appendf( |
| 3292 "// Copy Program FS\n" | 3314 "// Copy Program FS\n" |
| 3293 "void main() {" | 3315 "void main() {" |
| 3294 " %s = %s(u_texture, v_texCoord);" | 3316 " %s = %s(u_texture, v_texCoord);" |
| 3295 "}", | 3317 "}", |
| (...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3843 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || | 3865 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || |
| 3844 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { | 3866 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { |
| 3845 copyParams->fFilter = GrTextureParams::kNone_FilterMode; | 3867 copyParams->fFilter = GrTextureParams::kNone_FilterMode; |
| 3846 copyParams->fWidth = texture->width(); | 3868 copyParams->fWidth = texture->width(); |
| 3847 copyParams->fHeight = texture->height(); | 3869 copyParams->fHeight = texture->height(); |
| 3848 return true; | 3870 return true; |
| 3849 } | 3871 } |
| 3850 } | 3872 } |
| 3851 return false; | 3873 return false; |
| 3852 } | 3874 } |
| OLD | NEW |