i32 CShaderManager::Init()
	{
		//Create default shaders
		IInputLayout* pIL = m_pRenderSystem->GetInputLayout( ILE::POSITION );
		xst_assert2( pIL != xst_null );
		xst_assert2( pIL->GetVertexShader() != xst_null );
		
		/*IVertexShader* pVS = m_pRenderSystem->CreateDefaultVertexShader( pIL, this, 0, strVSName, XST::ResourceType::SHADER, XST::ResourceStates::CREATED, xst_null );
		if( pVS == xst_null )
		{
			return XST_FAIL;
		}*/

		xst_castring strPSName( "xse_default_ps" );
		Resources::IPixelShader* pPS = m_pRenderSystem->CreateDefaultPixelShader( xst_null, this, 0, strPSName, XST::ResourceType::SHADER, XST::ResourceStates::CREATED, xst_null );
		if( pPS == xst_null )
		{
			return XST_FAIL;
		}

		m_pDefaultPS = PixelShaderPtr( pPS );
		m_pDefaultVS = VertexShaderPtr( pIL->GetVertexShader() );

		return XST_OK;
	}
	PixelShaderPtr UGraphicsDevice::LoadPixelShader(const void* inPixelBytes, size_t inPixelBytesLength)
	{
		assert(inPixelBytes);

		ID3D11PixelShader* pixelShader = nullptr;
		HRESULT hr = mD3dDevice->CreatePixelShader(inPixelBytes, inPixelBytesLength, nullptr, &pixelShader);
		if (FAILED(hr))
		{
			LOG(LogGraphicsDevice, Error, "LoadPixelShader() Failed to load pixel shader\n");
			return nullptr;
		}

		return PixelShaderPtr(pixelShader, AutoReleaseD3D);
	}
	PixelShaderPtr CShaderManager::CompilePixelShader(xst_castring& strName, xst_castring& strEntryPoint, xst_castring& strCode, xst_castring& strGroupName)
	{
		ShaderPtr pShader = _CreateShader( ShaderTypes::PIXEL, strName, strEntryPoint, strGroupName );
		if( pShader == xst_null )
		{
			return pShader;
		}

		PixelShaderPtr pPS( pShader );
		
		if( XST_FAILED( pPS->Compile( strEntryPoint, ShaderProfiles::PS_BEST, strCode ) ) )
		{
			this->DestroyResource( pPS );
			return PixelShaderPtr();
		}
		pPS->m_iResourceState = Resources::ResourceStates::PREPARED;
		return pPS;
	}