Example #1
0
		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;
		}
Example #2
0
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;
}
Example #3
0
		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;
		}
Example #4
0
	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);
}
Example #6
0
Pipeline::Pipeline(GrManager* manager, U64 hash, GrObjectCache* cache)
	: GrObject(manager, CLASS_TYPE, hash, cache)
{
	ANKI_TRACE_INC_COUNTER(GR_PIPELINES_CREATED, 1);
}