| 153 | } |
| 154 | |
| 155 | bool ProgramState::init(Program* program) |
| 156 | { |
| 157 | AX_SAFE_RETAIN(program); |
| 158 | _program = program; |
| 159 | |
| 160 | _vertexLayout = program->getVertexLayout(); |
| 161 | _ownVertexLayout = false; |
| 162 | _vertexUniformBufferSize = _program->getUniformBufferSize(ShaderStage::VERTEX); |
| 163 | |
| 164 | #ifdef AX_USE_METAL |
| 165 | _fragmentUniformBufferSize = _program->getUniformBufferSize(ShaderStage::FRAGMENT); |
| 166 | #endif |
| 167 | |
| 168 | _uniformBuffers.resize((std::max)(_vertexUniformBufferSize + _fragmentUniformBufferSize, (size_t)1), 0); |
| 169 | |
| 170 | #if AX_ENABLE_CACHE_TEXTURE_DATA |
| 171 | _backToForegroundListener = |
| 172 | EventListenerCustom::create(EVENT_RENDERER_RECREATED, [this](EventCustom*) { this->resetUniforms(); }); |
| 173 | Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(_backToForegroundListener, -1); |
| 174 | #endif |
| 175 | |
| 176 | const auto programId = program->getProgramId(); |
| 177 | if (programId < ProgramType::BUILTIN_COUNT) |
| 178 | { |
| 179 | this->_batchId = programId; |
| 180 | this->_isBatchable = true; |
| 181 | } |
| 182 | |
| 183 | return true; |
| 184 | } |
| 185 | |
| 186 | void ProgramState::updateBatchId() |
| 187 | { |
nothing calls this directly
no test coverage detected