void GrGpuGLShaders::flushConvolution(int s) { const GrSamplerState& sampler = this->getDrawState().getSampler(s); int kernelUni = fProgramData->fUniLocations.fStages[s].fKernelUni; if (GrGLProgram::kUnusedUniform != kernelUni) { GL_CALL(Uniform1fv(kernelUni, sampler.getKernelWidth(), sampler.getKernel())); } int imageIncrementUni = fProgramData->fUniLocations.fStages[s].fImageIncrementUni; if (GrGLProgram::kUnusedUniform != imageIncrementUni) { const GrGLTexture* texture = static_cast<const GrGLTexture*>(this->getDrawState().getTexture(s)); float imageIncrement[2] = { 0 }; switch (sampler.getFilterDirection()) { case GrSamplerState::kX_FilterDirection: imageIncrement[0] = 1.0f / texture->width(); break; case GrSamplerState::kY_FilterDirection: imageIncrement[1] = 1.0f / texture->height(); break; default: GrCrash("Unknown filter direction."); } GL_CALL(Uniform2fv(imageIncrementUni, 1, imageIncrement)); } }
void GrGpuGLShaders::flushConvolution(int s) { const GrSamplerState& sampler = this->getDrawState().getSampler(s); int kernelUni = fProgramData->fUniLocations.fStages[s].fKernelUni; if (GrGLProgram::kUnusedUniform != kernelUni) { GL_CALL(Uniform1fv(kernelUni, sampler.getKernelWidth(), sampler.getKernel())); } int imageIncrementUni = fProgramData->fUniLocations.fStages[s].fImageIncrementUni; if (GrGLProgram::kUnusedUniform != imageIncrementUni) { GL_CALL(Uniform2fv(imageIncrementUni, 1, sampler.getImageIncrement())); } }
void GrGpuGLShaders::flushTexelSize(int s) { const int& uni = fProgramData->fUniLocations.fStages[s].fNormalizedTexelSizeUni; if (GrGLProgram::kUnusedUniform != uni) { GrGLTexture* texture = (GrGLTexture*) fCurrDrawState.fTextures[s]; if (texture->allocatedWidth() != fProgramData->fTextureWidth[s] || texture->allocatedHeight() != fProgramData->fTextureWidth[s]) { float texelSize[] = {1.f / texture->allocatedWidth(), 1.f / texture->allocatedHeight()}; GL_CALL(Uniform2fv(uni, 1, texelSize)); } } }
void GrGpuGLShaders::flushTexelSize(int s) { const int& uni = fProgramData->fUniLocations.fStages[s].fNormalizedTexelSizeUni; if (GrGLProgram::kUnusedUniform != uni) { const GrGLTexture* texture = static_cast<const GrGLTexture*>(this->getDrawState().getTexture(s)); if (texture->width() != fProgramData->fTextureWidth[s] || texture->height() != fProgramData->fTextureHeight[s]) { float texelSize[] = {1.f / texture->width(), 1.f / texture->height()}; GL_CALL(Uniform2fv(uni, 1, texelSize)); fProgramData->fTextureWidth[s] = texture->width(); fProgramData->fTextureHeight[s] = texture->height(); } } }
GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat* v) { CONTEXT_EXEC(Uniform2fv(location, count, v)); }