void GrGLProgram::bindTextures(const GrGLInstalledProc* ip, const GrProcessor& processor) { const SkTArray<GrGLInstalledProc::Sampler, true>& samplers = ip->fSamplers; int numSamplers = samplers.count(); SkASSERT(numSamplers == processor.numTextures()); for (int s = 0; s < numSamplers; ++s) { SkASSERT(samplers[s].fTextureUnit >= 0); const GrTextureAccess& textureAccess = processor.textureAccess(s); fGpu->bindTexture(samplers[s].fTextureUnit, textureAccess.getParams(), static_cast<GrGLTexture*>(textureAccess.getTexture())); } }
static uint32_t gen_texture_key(const GrProcessor& proc, const GrGLCaps& caps) { uint32_t key = 0; int numTextures = proc.numTextures(); for (int t = 0; t < numTextures; ++t) { const GrTextureAccess& access = proc.textureAccess(t); uint32_t configComponentMask = GrPixelConfigComponentMask(access.getTexture()->config()); if (swizzle_requires_alpha_remapping(caps, configComponentMask, access.swizzleMask())) { key |= 1 << t; } } return key; }
void GrGLProgram::bindTextures(const GrProcessor& processor, bool allowSRGBInputs, int* nextSamplerIdx) { for (int i = 0; i < processor.numTextures(); ++i) { const GrTextureAccess& access = processor.textureAccess(i); fGpu->bindTexture((*nextSamplerIdx)++, access.getParams(), allowSRGBInputs, static_cast<GrGLTexture*>(access.getTexture())); } for (int i = 0; i < processor.numBuffers(); ++i) { const GrBufferAccess& access = processor.bufferAccess(i); fGpu->bindTexelBuffer((*nextSamplerIdx)++, access.offsetInBytes(), access.texelConfig(), static_cast<GrGLBuffer*>(access.buffer())); } }
void GrVkProgramBuilder::emitSamplers(const GrProcessor& processor, GrGLSLTextureSampler::TextureSamplerArray* outSamplers) { int numTextures = processor.numTextures(); UniformHandle* localSamplerUniforms = fSamplerUniforms.push_back_n(numTextures); SkString name; for (int t = 0; t < numTextures; ++t) { name.printf("%d", t); localSamplerUniforms[t] = fUniformHandler.addUniform(kFragment_GrShaderFlag, kSampler2D_GrSLType, kDefault_GrSLPrecision, name.c_str()); outSamplers->emplace_back(localSamplerUniforms[t], processor.textureAccess(t)); } }
void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor, GrGLProcessor::TextureSamplerArray* outSamplers, GrGLInstalledProc<Proc>* ip) { int numTextures = processor.numTextures(); ip->fSamplers.push_back_n(numTextures); SkString name; for (int t = 0; t < numTextures; ++t) { name.printf("Sampler%d", t); ip->fSamplers[t].fUniform = this->addUniform(GrGLProgramBuilder::kFragment_Visibility, kSampler2D_GrSLType, kDefault_GrSLPrecision, name.c_str()); SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLProcessor::TextureSampler, (ip->fSamplers[t].fUniform, processor.textureAccess(t))); } }
static uint32_t gen_texture_key(const GrProcessor& proc, const GrGLCaps& caps) { uint32_t key = 0; int numTextures = proc.numTextures(); int shift = 0; for (int t = 0; t < numTextures; ++t) { const GrTextureAccess& access = proc.textureAccess(t); if (swizzle_requires_alpha_remapping(*caps.glslCaps(), access.getTexture()->config())) { key |= 1 << shift; } if (GR_GL_TEXTURE_EXTERNAL == static_cast<GrGLTexture*>(access.getTexture())->target()) { key |= 2 << shift; } shift += 2; } return key; }
bool GrProcessor::hasSameSamplers(const GrProcessor& that) const { if (this->numTextures() != that.numTextures() || this->numBuffers() != that.numBuffers()) { return false; } for (int i = 0; i < this->numTextures(); ++i) { if (this->textureAccess(i) != that.textureAccess(i)) { return false; } } for (int i = 0; i < this->numBuffers(); ++i) { if (this->bufferAccess(i) != that.bufferAccess(i)) { return false; } } return true; }
void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor, GrGLSLTextureSampler::TextureSamplerArray* outSamplers) { int numTextures = processor.numTextures(); UniformHandle* localSamplerUniforms = fSamplerUniforms.push_back_n(numTextures); SkString name; for (int t = 0; t < numTextures; ++t) { name.printf("Sampler%d", t); GrSLType samplerType = get_sampler_type(processor.textureAccess(t)); localSamplerUniforms[t] = fUniformHandler.addUniform(GrGLSLUniformHandler::kFragment_Visibility, samplerType, kDefault_GrSLPrecision, name.c_str()); SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLSLTextureSampler, (localSamplerUniforms[t], processor.textureAccess(t))); if (kSamplerExternal_GrSLType == samplerType) { const char* externalFeatureString = this->glslCaps()->externalTextureExtensionString(); // We shouldn't ever create a GrGLTexture that requires external sampler type SkASSERT(externalFeatureString); fFS.addFeature(1 << GrGLSLFragmentShaderBuilder::kExternalTexture_GLSLPrivateFeature, externalFeatureString); } } }