GrGLProgram::GrGLProgram(GrGLGpu* gpu, const GrProgramDesc& desc, const BuiltinUniformHandles& builtinUniforms, GrGLuint programID, const UniformInfoArray& uniforms, const UniformInfoArray& textureSamplers, const UniformInfoArray& texelBuffers, const VaryingInfoArray& pathProcVaryings, std::unique_ptr<GrGLSLPrimitiveProcessor> geometryProcessor, std::unique_ptr<GrGLSLXferProcessor> xferProcessor, const GrGLSLFragProcs& fragmentProcessors) : fBuiltinUniformHandles(builtinUniforms) , fProgramID(programID) , fGeometryProcessor(std::move(geometryProcessor)) , fXferProcessor(std::move(xferProcessor)) , fFragmentProcessors(fragmentProcessors) , fDesc(desc) , fGpu(gpu) , fProgramDataManager(gpu, programID, uniforms, pathProcVaryings) , fNumTextureSamplers(textureSamplers.count()) , fNumTexelBuffers(texelBuffers.count()) { // Assign texture units to sampler uniforms one time up front. GL_CALL(UseProgram(fProgramID)); fProgramDataManager.setSamplerUniforms(textureSamplers, 0); fProgramDataManager.setSamplerUniforms(texelBuffers, fNumTextureSamplers); }
GrVkProgramDataManager::GrVkProgramDataManager(const UniformInfoArray& uniforms, uint32_t vertexUniformSize, uint32_t fragmentUniformSize) : fVertexUniformSize(vertexUniformSize) , fFragmentUniformSize(fragmentUniformSize) { fVertexUniformData.reset(vertexUniformSize); fFragmentUniformData.reset(fragmentUniformSize); int count = uniforms.count(); fUniforms.push_back_n(count); // We must add uniforms in same order is the UniformInfoArray so that UniformHandles already // owned by other objects will still match up here. for (int i = 0; i < count; i++) { Uniform& uniform = fUniforms[i]; const GrVkUniformHandler::UniformInfo uniformInfo = uniforms[i]; SkASSERT(GrGLSLShaderVar::kNonArray == uniformInfo.fVariable.getArrayCount() || uniformInfo.fVariable.getArrayCount() > 0); SkDEBUGCODE( uniform.fArrayCount = uniformInfo.fVariable.getArrayCount(); uniform.fType = uniformInfo.fVariable.getType(); ); uniform.fBinding = uniformInfo.fBinding; uniform.fOffset = uniformInfo.fUBOffset; SkDEBUGCODE( uniform.fSetNumber = uniformInfo.fSetNumber; );
GrGLProgramDataManager::GrGLProgramDataManager(GrGLGpu* gpu, GrGLuint programID, const UniformInfoArray& uniforms, const VaryingInfoArray& pathProcVaryings) : fGpu(gpu) , fProgramID(programID) { int count = uniforms.count(); fUniforms.push_back_n(count); for (int i = 0; i < count; i++) { Uniform& uniform = fUniforms[i]; const UniformInfo& builderUniform = uniforms[i]; SkASSERT(GrGLSLShaderVar::kNonArray == builderUniform.fVariable.getArrayCount() || builderUniform.fVariable.getArrayCount() > 0); SkDEBUGCODE( uniform.fArrayCount = builderUniform.fVariable.getArrayCount(); uniform.fType = builderUniform.fVariable.getType(); ); // TODO: Move the Xoom uniform array in both FS and VS bug workaround here. if (GrGLSLUniformHandler::kVertex_Visibility & builderUniform.fVisibility) { uniform.fVSLocation = builderUniform.fLocation; } else { uniform.fVSLocation = kUnusedUniform; } if (GrGLSLUniformHandler::kFragment_Visibility & builderUniform.fVisibility) { uniform.fFSLocation = builderUniform.fLocation; } else { uniform.fFSLocation = kUnusedUniform; } }
GrGLProgramDataManager::GrGLProgramDataManager(GrGLGpu* gpu, GrGLuint programID, const UniformInfoArray& uniforms, const VaryingInfoArray& pathProcVaryings) : fGpu(gpu) , fProgramID(programID) { int count = uniforms.count(); fUniforms.push_back_n(count); for (int i = 0; i < count; i++) { Uniform& uniform = fUniforms[i]; const UniformInfo& builderUniform = uniforms[i]; SkASSERT(GrShaderVar::kNonArray == builderUniform.fVariable.getArrayCount() || builderUniform.fVariable.getArrayCount() > 0); SkDEBUGCODE( uniform.fArrayCount = builderUniform.fVariable.getArrayCount(); uniform.fType = builderUniform.fVariable.getType(); ); uniform.fLocation = builderUniform.fLocation; }
GrVkPipelineState::GrVkPipelineState( GrVkGpu* gpu, GrVkPipeline* pipeline, VkPipelineLayout layout, const GrVkDescriptorSetManager::Handle& samplerDSHandle, const GrGLSLBuiltinUniformHandles& builtinUniformHandles, const UniformInfoArray& uniforms, uint32_t geometryUniformSize, uint32_t fragmentUniformSize, const UniformInfoArray& samplers, std::unique_ptr<GrGLSLPrimitiveProcessor> geometryProcessor, std::unique_ptr<GrGLSLXferProcessor> xferProcessor, std::unique_ptr<std::unique_ptr<GrGLSLFragmentProcessor>[]> fragmentProcessors, int fragmentProcessorCnt) : fPipeline(pipeline) , fPipelineLayout(new GrVkPipelineLayout(layout)) , fUniformDescriptorSet(nullptr) , fSamplerDescriptorSet(nullptr) , fSamplerDSHandle(samplerDSHandle) , fBuiltinUniformHandles(builtinUniformHandles) , fGeometryProcessor(std::move(geometryProcessor)) , fXferProcessor(std::move(xferProcessor)) , fFragmentProcessors(std::move(fragmentProcessors)) , fFragmentProcessorCnt(fragmentProcessorCnt) , fDataManager(uniforms, geometryUniformSize, fragmentUniformSize) { fDescriptorSets[0] = VK_NULL_HANDLE; fDescriptorSets[1] = VK_NULL_HANDLE; fDescriptorSets[2] = VK_NULL_HANDLE; fGeometryUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, geometryUniformSize)); fFragmentUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, fragmentUniformSize)); fNumSamplers = samplers.count(); for (int i = 0; i < fNumSamplers; ++i) { // We store the immutable samplers here and take ownership of the ref from the // GrVkUnformHandler. fImmutableSamplers.push_back(samplers[i].fImmutableSampler); } }