예제 #1
0
/** Fills the associated state object using the given IDs */
void D3D11GraphicsEngineQueued::FillPipelineStateObject(PipelineState* state)
{
	D3D11PipelineState* s = (D3D11PipelineState*)state;

	// Get state objects from id
	D3D11BlendStateInfo* blendState = D3D11ObjectIDs::BlendStateByID[(UINT8)state->BaseState.BlendStateID];
	D3D11RasterizerStateInfo* rasterizerState = D3D11ObjectIDs::RasterizerStateByID[(UINT8)state->BaseState.RasterizerStateID];
	D3D11DepthBufferState* depthStencilState = D3D11ObjectIDs::DepthStateByID[(UINT8)state->BaseState.DepthStencilID];

	// Put them into our queue object
	if(blendState)
		s->BlendState = blendState->State;

	if(rasterizerState)
		s->RasterizerState = rasterizerState->State;

	if(depthStencilState)
		s->DepthStencilState = depthStencilState->State;

	// TODO: Do this for sampler states as well
	s->SamplerState = DefaultSamplerState;

	// Enter rendertargets
	s->RenderTargetViews[0] = Backbuffer->GetRenderTargetView();
	s->NumRenderTargetViews = 1;
	s->DepthStencilView = DepthStencilBuffer->GetDepthStencilView();

	// Enter textures
	for(int i=0;i<8;i++)
	{
		D3D11Texture* tex = (D3D11Texture *)D3D11ObjectIDs::TextureByID[s->BaseState.TextureIDs[i]];
		if(!tex)
			break;

		s->Textures[i] = tex->GetShaderResourceView();
		s->BaseState.NumTextures = i+1;
	}

	// Buffers
	s->ConstantBuffersVS.clear();
	for(int i=0;i<ARRAYSIZE(s->BaseState.ConstantBuffersVS);i++)
	{
		D3D11ConstantBuffer* buf = (D3D11ConstantBuffer *)s->BaseState.ConstantBuffersVS[i];
		if(!buf)
			break;

		s->ConstantBuffersVS.push_back(buf->Get());
	}

	s->ConstantBuffersPS.clear();
	for(int i=0;i<ARRAYSIZE(s->BaseState.ConstantBuffersPS);i++)
	{
		D3D11ConstantBuffer* buf = (D3D11ConstantBuffer *)s->BaseState.ConstantBuffersPS[i];
		if(!buf)
			break;

		s->ConstantBuffersPS.push_back(buf->Get());
	}

	s->ConstantBuffersHDS.clear();
	for(int i=0;i<ARRAYSIZE(s->BaseState.ConstantBuffersHDS);i++)
	{
		D3D11ConstantBuffer* buf = (D3D11ConstantBuffer *)s->BaseState.ConstantBuffersHDS[i];
		if(!buf)
			break;

		s->ConstantBuffersHDS.push_back(buf->Get());
	}

	s->ConstantBuffersGS.clear();
	for(int i=0;i<ARRAYSIZE(s->BaseState.ConstantBuffersGS);i++)
	{
		D3D11ConstantBuffer* buf = (D3D11ConstantBuffer *)s->BaseState.ConstantBuffersGS[i];
		if(!buf)
			break;

		s->ConstantBuffersGS.push_back(buf->Get());
	}

	s->VertexBuffers.clear();
	for(int i=0;i<ARRAYSIZE(s->BaseState.VertexBuffers);i++)
	{
		D3D11VertexBuffer* buf = (D3D11VertexBuffer *)s->BaseState.VertexBuffers[i];
		if(buf)
			s->VertexBuffers.push_back(buf->GetVertexBuffer());
	}

	s->StructuredBuffersVS.clear();
	for(int i=0;i<ARRAYSIZE(s->BaseState.StructuredBuffersVS);i++)
	{
		D3D11VertexBuffer* buf = (D3D11VertexBuffer *)s->BaseState.StructuredBuffersVS[i];
		if(buf)
			s->StructuredBuffersVS.push_back(buf->GetShaderResourceView());
	}

	if(s->BaseState.IndexBuffer)
		s->IndexBuffer = ((D3D11VertexBuffer *)s->BaseState.IndexBuffer)->GetVertexBuffer();

	D3D11PShader* ps = D3D11ObjectIDs::PShadersByID[s->BaseState.PShaderID];
	D3D11VShader* vs = D3D11ObjectIDs::VShadersByID[s->BaseState.VShaderID];
	D3D11HDShader* hds = D3D11ObjectIDs::HDShadersByID[s->BaseState.HDShaderID];
	//D3D11PShader* gs = NULL;//D3D11PShader::ShadersByID[s->BaseState.PShaderID];


	s->PixelShader = ps ? ps->GetShader() : NULL;
	s->VertexShader = vs ? vs->GetShader() : NULL;
	s->InputLayout = vs ? vs->GetInputLayout() : NULL;
	s->HullShader = hds ? hds->GetHShader() : NULL;
	s->DomainShader = hds ? hds->GetDShader() : NULL;
	s->GeometryShader = NULL;//D3D11PShader::ShadersByID[s->BaseState.PShaderID]->GetShader();

	// Build the sort-key
	s->SortItem.stateValue = s->SortItem.Build(s->BaseState);
}