Beispiel #1
0
    void init(ID3D11Device& device, Shaders& shaders)
    {
        assert(shaders.mTerrainDS == nullptr);
        assert(shaders.mTerrainVS == nullptr);
        assert(shaders.mTerrainHS == nullptr);
        assert(shaders.mTerrainIL == nullptr);
        assert(shaders.mTerrainPS == nullptr);
        assert(shaders.mTerrainCS == nullptr);

        // Store shader byte code, used to create a shader.
        std::vector<char> shaderByteCode;

        // Vertex shader
        computeShaderByteCode(L"HLSL/TerrainVS.cso", shaderByteCode);
        buildShapesVertexLayout(device, shaderByteCode, shaders.mTerrainIL);
        HRESULT result = device.CreateVertexShader(
            &shaderByteCode[0],
            shaderByteCode.size(),
            nullptr,
            &shaders.mTerrainVS);
        DxErrorChecker(result);

        // Pixel shader
        computeShaderByteCode(L"HLSL/TerrainPS.cso", shaderByteCode);        
        result = device.CreatePixelShader(
            &shaderByteCode[0], 
            shaderByteCode.size(), 
            nullptr, 
            &shaders.mTerrainPS);
        DxErrorChecker(result);

        // Hull shader
        computeShaderByteCode(L"HLSL/TerrainHS.cso", shaderByteCode);        
        result = device.CreateHullShader(
            &shaderByteCode[0], 
            shaderByteCode.size(), 
            nullptr, 
            &shaders.mTerrainHS);
        DxErrorChecker(result);

        // Pixel shader
        computeShaderByteCode(L"HLSL/TerrainDS.cso", shaderByteCode);        
        result = device.CreateDomainShader(
            &shaderByteCode[0], 
            shaderByteCode.size(), 
            nullptr, 
            &shaders.mTerrainDS);
        DxErrorChecker(result);

        // Compute Shader
        computeShaderByteCode(L"HLSL/TerrainCS.cso", shaderByteCode);        
        result = device.CreateComputeShader(
            &shaderByteCode[0], 
            shaderByteCode.size(), 
            nullptr, 
            &shaders.mTerrainCS);
        DxErrorChecker(result);
    }
vpResult vprShaderProgramDX11::init()
{
	vprDeviceDX11* dx11Device = static_cast<vprDeviceDX11*>(m_device);
	ID3D11Device* nativeDevice = dx11Device->getNativeDevice();

	if (m_desc.hasVertexShader())
	{
		if (nativeDevice->CreateVertexShader(m_desc.m_bytecodes[vprShaderStage::VERTEX_SHADER]->getPointer(),
				m_desc.m_bytecodes[vprShaderStage::VERTEX_SHADER]->getSize(), NULL, &m_nativeVertexShader))
		{
			return VP_FAILURE;
		}
	}
	if (m_desc.hasGeometryShader())
	{
		if (nativeDevice->CreateGeometryShader(m_desc.m_bytecodes[vprShaderStage::GEOMETRY_SHADER]->getPointer(),
				m_desc.m_bytecodes[vprShaderStage::GEOMETRY_SHADER]->getSize(), NULL, &m_nativeGeometryShader))
		{
			return VP_FAILURE;
		}
	}
	if (m_desc.hasHullShader())
	{
		if (nativeDevice->CreateHullShader(m_desc.m_bytecodes[vprShaderStage::HULL_SHADER]->getPointer(),
				m_desc.m_bytecodes[vprShaderStage::HULL_SHADER]->getSize(), NULL, &m_nativeHullShader))
		{
			return VP_FAILURE;
		}
	}
	if (m_desc.hasDomainShader())
	{
		if (nativeDevice->CreateDomainShader(m_desc.m_bytecodes[vprShaderStage::DOMAIN_SHADER]->getPointer(),
				m_desc.m_bytecodes[vprShaderStage::DOMAIN_SHADER]->getSize(), NULL, &m_nativeDomainShader))
		{
			return VP_FAILURE;
		}
	}
	if (m_desc.hasPixelShader())
	{
		if (nativeDevice->CreatePixelShader(m_desc.m_bytecodes[vprShaderStage::PIXEL_SHADER]->getPointer(),
				m_desc.m_bytecodes[vprShaderStage::PIXEL_SHADER]->getSize(), NULL, &m_nativePixelShader))
		{
			return VP_FAILURE;
		}
	}
	if (m_desc.hasComputeShader())
	{
		if (nativeDevice->CreateComputeShader(m_desc.m_bytecodes[vprShaderStage::COMPUTE_SHADER]->getPointer(),
				m_desc.m_bytecodes[vprShaderStage::COMPUTE_SHADER]->getSize(), NULL, &m_nativeComputeShader))
		{
			return VP_FAILURE;
		}
	}

	return VP_SUCCESS;
}
Beispiel #3
0
	bool Shader::create( GraphicsSystem& graphicsSystem, ShaderType type, const void* pInitData, uint dataSize )
	{
		TIKI_ASSERT( pInitData != nullptr );
		TIKI_ASSERT( dataSize > 0u );

		m_platformData.pShaderCode		= pInitData;
		m_platformData.shaderCodeLength	= dataSize;

		m_type	= type;
		m_hash	= crcBytes( m_platformData.pShaderCode, m_platformData.shaderCodeLength );

		ID3D11Device* pDevice = GraphicsSystemPlatform::getDevice( graphicsSystem );

		HRESULT result = S_FALSE;
		switch ( m_type )
		{
		case ShaderType_ComputeShader:
			result = pDevice->CreateComputeShader( pInitData, dataSize, nullptr, &m_platformData.pComputeShader );
			break;
		case ShaderType_DomainShader:
			result = pDevice->CreateDomainShader( pInitData, dataSize, nullptr, &m_platformData.pDomainShader );
			break;
		case ShaderType_GeometrieShader:
			result = pDevice->CreateGeometryShader( pInitData, dataSize, nullptr, &m_platformData.pGeometryShader );
			break;
		case ShaderType_HullShader:
			result = pDevice->CreateHullShader( pInitData, dataSize, nullptr, &m_platformData.pHullShader );
			break;
		case ShaderType_PixelShader:
			result = pDevice->CreatePixelShader( pInitData, dataSize, nullptr, &m_platformData.pPixelShader );
			break;
		case ShaderType_VertexShader:
			result = pDevice->CreateVertexShader( pInitData, dataSize, nullptr, &m_platformData.pVertexShader );
			break;
		default:
			TIKI_BREAK( "[graphics] ShaderType not supported.\n" );
			break;
		}

		if ( FAILED( result ) || m_platformData.pShaderObject == nullptr )
		{
			dispose( graphicsSystem );
			return false;
		}

		return true;
	}
	bool init(ID3D11Device* dev, int argc, char** argv)
	{
		this->dev = dev;
		ensure(dev->CreateVertexShader(g_vs, sizeof(g_vs), NULL, &vs));
		ensure(dev->CreateHullShader(g_hs, sizeof(g_hs), NULL, &hs));
		ensure(dev->CreateDomainShader(g_ds, sizeof(g_ds), NULL, &ds));
		ensure(dev->CreatePixelShader(g_ps, sizeof(g_ps), NULL, &ps));
		
		D3D11_INPUT_ELEMENT_DESC elements[1] =
		{
			{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,
			0, D3D11_INPUT_PER_VERTEX_DATA, 0},
		};

		ensure(dev->CreateInputLayout(elements, 1, g_vs, sizeof(g_vs), &layout));

		D3D11_BUFFER_DESC bufferd;
		bufferd.ByteWidth = sizeof(vertex_data);
		bufferd.Usage = D3D11_USAGE_IMMUTABLE;
		bufferd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
		bufferd.CPUAccessFlags = 0;
		bufferd.MiscFlags = 0;
		bufferd.StructureByteStride = 0;

		D3D11_SUBRESOURCE_DATA buffersd;
		buffersd.pSysMem = vertex_data;

		ensure(dev->CreateBuffer(&bufferd, &buffersd, &vb));

		D3D11_BUFFER_DESC cbd;
		cbd.ByteWidth = (sizeof(cb_frame_t) + 15) & ~15;
		cbd.Usage = D3D11_USAGE_DYNAMIC;
		cbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
		cbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
		cbd.MiscFlags = 0;
		cbd.StructureByteStride = 0;

		ensure(dev->CreateBuffer(&cbd, NULL, &cb_frame));
		return true;
	}
Beispiel #5
0
void FMaterial::Compile(const FShaderProgramInfo* VertexShaderInfo, const FShaderProgramInfo* PixelShaderInfo, const FShaderProgramInfo* GeometryShaderInfo, const FShaderProgramInfo* HullShaderInfo, const FShaderProgramInfo* DomainShaderInfo)
{
	ID3D11Device* Device = GraphicsContext->GetDevice();

	// Core shaders blobs
	FBlobPointer VertexShaderBlob, PixelShaderBlob;

	// Optional shaders blobs
	FBlobPointer GeometryShaderBlob, HullShaderBlob, DomainShaderBlob;

	bool bCompilationSuccessful = VertexShaderInfo->Compile(VertexShaderBlob.GetReference()) && PixelShaderInfo->Compile(PixelShaderBlob.GetReference());

	if (GeometryShaderInfo != nullptr)
	{
		GeometryShaderInfo->Compile(GeometryShaderBlob.GetReference());
	}

	if (DomainShaderInfo != nullptr && HullShaderInfo != nullptr)
	{
		DomainShaderInfo->Compile(DomainShaderBlob.GetReference());
		HullShaderInfo->Compile(HullShaderBlob.GetReference());
	}

	if (bCompilationSuccessful)
	{
		Release(); // We release only if compilation was successful. (this makes hot reloading fault tolerant case because we can keep the older shaders running)

		ID3D11ShaderReflection* VertexShaderReflection, *PixelShaderReflection;
		ID3D11ShaderReflection* GeometryShaderReflection = nullptr, *HullShaderReflection = nullptr, *DomainShaderReflection = nullptr;

		Device->CreateVertexShader(VertexShaderBlob->GetBufferPointer(), VertexShaderBlob->GetBufferSize(), nullptr, &VertexShader);
		Device->CreatePixelShader(PixelShaderBlob->GetBufferPointer(), PixelShaderBlob->GetBufferSize(), nullptr, &PixelShader);

		D3DSetDebugName(VertexShader, VertexShaderInfo->GetDebugName());
		D3DSetDebugName(PixelShader, PixelShaderInfo->GetDebugName());

		D3DReflect(VertexShaderBlob->GetBufferPointer(), VertexShaderBlob->GetBufferSize(), IID_ID3D11ShaderReflection, (void**)&VertexShaderReflection);
		D3DReflect(PixelShaderBlob->GetBufferPointer(), PixelShaderBlob->GetBufferSize(), IID_ID3D11ShaderReflection, (void**)&PixelShaderReflection);

		if (GeometryShaderBlob)
		{
			Device->CreateGeometryShader(GeometryShaderBlob->GetBufferPointer(), GeometryShaderBlob->GetBufferSize(), nullptr, &GeometryShader);
			D3DSetDebugName(GeometryShader, GeometryShaderInfo->GetDebugName());
			D3DReflect(GeometryShaderBlob->GetBufferPointer(), GeometryShaderBlob->GetBufferSize(), IID_ID3D11ShaderReflection, (void**)&GeometryShaderReflection);
		}

		if (DomainShaderBlob && HullShaderBlob)
		{
			Device->CreateHullShader(HullShaderBlob->GetBufferPointer(), HullShaderBlob->GetBufferSize(), nullptr, &HullShader);
			Device->CreateDomainShader(DomainShaderBlob->GetBufferPointer(), DomainShaderBlob->GetBufferSize(), nullptr, &DomainShader);
			
			D3DSetDebugName(HullShader, HullShaderInfo->GetDebugName());
			D3DSetDebugName(DomainShader, DomainShaderInfo->GetDebugName());

			D3DReflect(HullShaderBlob->GetBufferPointer(), HullShaderBlob->GetBufferSize(), IID_ID3D11ShaderReflection, (void**)&HullShaderReflection);
			D3DReflect(DomainShaderBlob->GetBufferPointer(), DomainShaderBlob->GetBufferSize(), IID_ID3D11ShaderReflection, (void**)&DomainShaderReflection);
		}

		CreateInputLayoutDescFromVertexShaderSignature(VertexShaderReflection, VertexShaderBlob, Device);

		MaterialParameters = Make_Unique<FMaterialParameters>(GraphicsContext, VertexShaderReflection, PixelShaderReflection, GeometryShaderReflection, HullShaderReflection, DomainShaderReflection);

		VertexShaderReflection->Release();
		PixelShaderReflection->Release();

		if (GeometryShaderReflection != nullptr)
			GeometryShaderReflection->Release();

		if (DomainShaderReflection != nullptr)
			DomainShaderReflection->Release();

		if (HullShaderReflection != nullptr)
			HullShaderReflection->Release();
	}
}