Error operator()(GlState& state) { GLenum indicesType = 0; switch(state.m_indexSize) { case 2: indicesType = GL_UNSIGNED_SHORT; break; case 4: indicesType = GL_UNSIGNED_INT; break; default: ANKI_ASSERT(0); break; }; state.flushVertexState(); state.flushStencilState(); glDrawElementsInstancedBaseVertexBaseInstance(state.m_topology, m_info.m_count, indicesType, (const void*)(PtrSize)(m_info.m_firstIndex * state.m_indexSize), m_info.m_instanceCount, m_info.m_baseVertex, m_info.m_baseInstance); ANKI_TRACE_INC_COUNTER(GR_DRAWCALLS, 1); ANKI_TRACE_INC_COUNTER(GR_VERTICES, m_info.m_instanceCount * m_info.m_count); return ErrorCode::NONE; }
VkCommandBuffer CommandBufferFactory::newCommandBuffer(CommandBufferFlag cmdbFlags) { ANKI_ASSERT(isCreated()); Bool secondLevel = !!(cmdbFlags & CommandBufferFlag::SECOND_LEVEL); Bool smallBatch = !!(cmdbFlags & CommandBufferFlag::SMALL_BATCH); CmdbType& type = m_types[secondLevel][smallBatch]; LockGuard<Mutex> lock(type.m_mtx); VkCommandBuffer out = VK_NULL_HANDLE; if(type.m_count > 0) { // Recycle --type.m_count; out = type.m_cmdbs[type.m_count]; } else { // Create a new one VkCommandBufferAllocateInfo ci = {}; ci.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; ci.commandPool = m_pool; ci.level = (secondLevel) ? VK_COMMAND_BUFFER_LEVEL_SECONDARY : VK_COMMAND_BUFFER_LEVEL_PRIMARY; ci.commandBufferCount = 1; ANKI_TRACE_INC_COUNTER(VK_CMD_BUFFER_CREATE, 1); ANKI_VK_CHECKF(vkAllocateCommandBuffers(m_dev, &ci, &out)); } ANKI_ASSERT(out); return out; }
Error operator()(GlState& state) { state.flushVertexState(); state.flushStencilState(); glDrawArraysInstancedBaseInstance( state.m_topology, m_info.m_first, m_info.m_count, m_info.m_instanceCount, m_info.m_baseInstance); ANKI_TRACE_INC_COUNTER(GR_DRAWCALLS, 1); return ErrorCode::NONE; }
Error operator()(GlState& state) { if(state.m_lastPplineBoundUuid != m_ppline->getUuid()) { ANKI_TRACE_START_EVENT(GL_BIND_PPLINE); PipelineImpl& impl = m_ppline->getImplementation(); impl.bind(state); state.m_lastPplineBoundUuid = m_ppline->getUuid(); ANKI_TRACE_INC_COUNTER(GR_PIPELINE_BINDS_HAPPENED, 1); ANKI_TRACE_STOP_EVENT(GL_BIND_PPLINE); } else { ANKI_TRACE_INC_COUNTER(GR_PIPELINE_BINDS_SKIPPED, 1); } return ErrorCode::NONE; }
void ShadowMapping::runEsm(RenderPassWorkContext& rgraphCtx) { ANKI_ASSERT(m_esmResolveWorkItems.getSize()); ANKI_TRACE_SCOPED_EVENT(R_SM); CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer; cmdb->bindShaderProgram(m_esmResolveGrProg); cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp); rgraphCtx.bindTexture(0, 1, m_scratchRt, TextureSubresourceInfo(DepthStencilAspectBit::DEPTH)); for(const EsmResolveWorkItem& workItem : m_esmResolveWorkItems) { ANKI_TRACE_INC_COUNTER(R_SHADOW_PASSES, 1); cmdb->setViewport( workItem.m_viewportOut[0], workItem.m_viewportOut[1], workItem.m_viewportOut[2], workItem.m_viewportOut[3]); cmdb->setScissor( workItem.m_viewportOut[0], workItem.m_viewportOut[1], workItem.m_viewportOut[2], workItem.m_viewportOut[3]); struct Uniforms { Vec2 m_uvScale; Vec2 m_uvTranslation; F32 m_near; F32 m_far; U32 m_renderingTechnique; U32 m_padding; } unis; unis.m_uvScale = workItem.m_uvIn.zw(); unis.m_uvTranslation = workItem.m_uvIn.xy(); unis.m_near = workItem.m_cameraNear; unis.m_far = workItem.m_cameraFar; if(workItem.m_perspectiveProjection) { unis.m_renderingTechnique = (workItem.m_blur) ? 0 : 1; } else { unis.m_renderingTechnique = (workItem.m_blur) ? 2 : 3; } cmdb->setPushConstants(&unis, sizeof(unis)); drawQuad(cmdb); } // Restore GR state cmdb->setScissor(0, 0, MAX_U32, MAX_U32); }
Pipeline::Pipeline(GrManager* manager, U64 hash, GrObjectCache* cache) : GrObject(manager, CLASS_TYPE, hash, cache) { ANKI_TRACE_INC_COUNTER(GR_PIPELINES_CREATED, 1); }