static void add_sampler_keys(GrProcessorKeyBuilder* b, const GrProcessor& proc, const GrGLSLCaps& caps) { int numTextures = proc.numTextures(); int numSamplers = numTextures + proc.numBuffers(); // Need two bytes per key (swizzle, sampler type, and precision). int word32Count = (numSamplers + 1) / 2; if (0 == word32Count) { return; } uint16_t* k16 = SkTCast<uint16_t*>(b->add32n(word32Count)); int i = 0; for (; i < numTextures; ++i) { const GrTextureAccess& access = proc.textureAccess(i); const GrTexture* tex = access.getTexture(); k16[i] = sampler_key(tex->samplerType(), tex->config(), access.getVisibility(), caps); } for (; i < numSamplers; ++i) { const GrBufferAccess& access = proc.bufferAccess(i - numTextures); k16[i] = sampler_key(kSamplerBuffer_GrSLType, access.texelConfig(), access.visibility(), caps); } // zero the last 16 bits if the number of samplers is odd. if (numSamplers & 0x1) { k16[numSamplers] = 0; } }
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())); } }
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; }