void DirectX11RenderManager::initialise(ID3D11Device* _device)
	{
		MYGUI_PLATFORM_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice");
		MYGUI_PLATFORM_LOG(Info, "* Initialise: " << getClassTypeName());

		mpD3DDevice = _device;
		_device->GetImmediateContext(&mpD3DContext);

		mVertexFormat = VertexColourType::ColourABGR;

		std::string vertexProfile, pixelProfile;
		if ( mpD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_11_0 )
		{
			vertexProfile = "vs_5_0";
			pixelProfile = "ps_5_0";
		}
		else if ( mpD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_10_1 )
		{
			vertexProfile = "vs_4_1";
			pixelProfile = "ps_4_1";
		}
		else if ( mpD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_10_0 )
		{
			vertexProfile = "vs_4_0";
			pixelProfile = "ps_4_0";
		}
		else if ( mpD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_9_3 )
		{
			vertexProfile = "vs_4_0_level_9_3";
			pixelProfile = "ps_4_0_level_9_3";
		}
		else if ( mpD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_9_2 )
		{
			vertexProfile = "vs_4_0_level_9_1";
			pixelProfile = "ps_4_0_level_9_1";
		}
		else if ( mpD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_9_1 )
		{
			vertexProfile = "vs_4_0_level_9_1";
			pixelProfile = "ps_4_0_level_9_1";
		}

		// Get Current viewports
		memset(&mInfo, 0, sizeof(mInfo));
		UINT numViewports = 0;
		D3D11_VIEWPORT viewports[8];

		mpD3DContext->RSGetViewports(&numViewports, viewports);
		MYGUI_PLATFORM_ASSERT(numViewports == 0, getClassTypeName() << " 0 viewport sets");

		setViewSize((int)viewports[0].Width, (int)viewports[0].Height);

		UINT flags = (1 << 11) | (1 << 15);

		// Build Flat Vertex Shader
		ID3DBlob* bytecode = 0, *errors = 0, *signature0 = 0, *signature1 = 0;
		HRESULT hr = D3DCompile(vsSource, strlen(vsSource), "VertexShader0", 0, 0, "main", vertexProfile.c_str(), flags, 0, &bytecode, &errors);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, (errors ? (char*)errors->GetBufferPointer() : "Vertex Shader Compilation failed, unknown errors!"));

		hr = D3DGetInputSignatureBlob(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), &signature0);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, (errors ? (char*)errors->GetBufferPointer() : "Vertex Shader Compilation failed, failed to get input signature!"));

		hr = mpD3DDevice->CreateVertexShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), 0, &mVertexShader0);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, (errors ? (char*)errors->GetBufferPointer() : "Vertex Shader Create failed!"));

		if ( bytecode ) bytecode->Release();
		if ( errors ) errors->Release();


		// Build Textured Vertex Shader
		bytecode = 0;
		errors = 0;
		hr = D3DCompile(vsTexturedSource, strlen(vsTexturedSource), "VertexShader1", 0, 0, "main", vertexProfile.c_str(), flags, 0, &bytecode, &errors);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, (errors ? (char*)errors->GetBufferPointer() : "Vertex Shader Compilation failed, unknown errors!"));

		hr = D3DGetInputSignatureBlob(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), &signature1);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, (errors ? (char*)errors->GetBufferPointer() : "Vertex Shader Compilation failed, failed to get input signature!"));

		hr = mpD3DDevice->CreateVertexShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), 0, &mVertexShader1);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, (errors ? (char*)errors->GetBufferPointer() : "Vertex Shader Create failed!"));

		if ( bytecode ) bytecode->Release();
		if ( errors ) errors->Release();

		// Build Flat Pixel Shader
		bytecode = 0;
		errors = 0;
		hr = D3DCompile(psSource, strlen(psSource), "PixelShader0", 0, 0, "main", pixelProfile.c_str(), flags, 0, &bytecode, &errors);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, (errors ? (char*)errors->GetBufferPointer() : "Vertex Shader Compilation failed, unknown errors!"));

		hr = mpD3DDevice->CreatePixelShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), 0, &mPixelShader0);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, (errors ? (char*)errors->GetBufferPointer() : "Vertex Shader Create failed!"));

		if ( bytecode ) bytecode->Release();
		if ( errors ) errors->Release();


		// Build Textured Pixel Shader
		bytecode = 0;
		errors = 0;
		hr = D3DCompile(psTexturedSource, strlen(psTexturedSource), "PixelShader1", 0, 0, "main", pixelProfile.c_str(), flags, 0, &bytecode, &errors);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, (errors ? (char*)errors->GetBufferPointer() : "Vertex Shader Compilation failed, unknown errors!"));

		hr = mpD3DDevice->CreatePixelShader(bytecode->GetBufferPointer(), bytecode->GetBufferSize(), 0, &mPixelShader1);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, (errors ? (char*)errors->GetBufferPointer() : "Vertex Shader Create failed!"));

		if ( bytecode ) bytecode->Release();
		if ( errors ) errors->Release();

		// Create Sampler State
		D3D11_SAMPLER_DESC samplerDesc;
		samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
		samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
		samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
		samplerDesc.BorderColor[0] = samplerDesc.BorderColor[1] = samplerDesc.BorderColor[2] = samplerDesc.BorderColor[3] = 0.0f;
		samplerDesc.ComparisonFunc = (D3D11_COMPARISON_FUNC)0;
		samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
		samplerDesc.MaxAnisotropy = 1;
		samplerDesc.MaxLOD = 0;
		samplerDesc.MinLOD = 0;
		samplerDesc.MipLODBias = 0.0f;
		hr = mpD3DDevice->CreateSamplerState(&samplerDesc, &mSamplerState);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, "Sampler State Create failed!");

		// Create Blend State
		D3D11_BLEND_DESC blendDesc;
		blendDesc.AlphaToCoverageEnable = false;
		blendDesc.IndependentBlendEnable = false;
		blendDesc.RenderTarget[0].BlendEnable = true;
		blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
		blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
		blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
		blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
		blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
		blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
		blendDesc.RenderTarget[0].RenderTargetWriteMask = 0x0f;
		hr = mpD3DDevice->CreateBlendState(&blendDesc, &mBlendState);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, "Blend State Create failed!");

		// Create Depth Stencil State
		D3D11_DEPTH_STENCIL_DESC depthDesc;
		depthDesc.DepthEnable = false;
		depthDesc.DepthFunc = D3D11_COMPARISON_ALWAYS;
		depthDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO;
		depthDesc.StencilEnable = false;
		depthDesc.StencilReadMask = depthDesc.StencilWriteMask = 0;
		depthDesc.BackFace.StencilDepthFailOp = depthDesc.BackFace.StencilFailOp = depthDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
		depthDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
		depthDesc.FrontFace = depthDesc.BackFace;
		hr = mpD3DDevice->CreateDepthStencilState(&depthDesc, &mDepthStencilState);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, "Depth Stencil State Create failed!");

		// Create Rasterizer State
		D3D11_RASTERIZER_DESC rastDesc;
		rastDesc.FillMode              = D3D11_FILL_SOLID;
		rastDesc.CullMode              = D3D11_CULL_NONE;
		rastDesc.FrontCounterClockwise = FALSE;
		rastDesc.DepthBias             = 0;
		rastDesc.DepthBiasClamp        = 0;
		rastDesc.SlopeScaledDepthBias  = 0;
		rastDesc.ScissorEnable         = FALSE;
		rastDesc.MultisampleEnable     = FALSE;
		rastDesc.AntialiasedLineEnable = FALSE;
		hr = mpD3DDevice->CreateRasterizerState(&rastDesc, &mRasterizerState);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, "Rasterizer State Create failed!");

		// Create Input Layout
		hr = mpD3DDevice->CreateInputLayout(vertexLayout, 3, signature0->GetBufferPointer(), signature0->GetBufferSize(), &mInputLayout0);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, "Input Layout Create failed!");

		signature0->Release();

		// Create Input Layout
		hr = mpD3DDevice->CreateInputLayout(vertexLayout, 3, signature1->GetBufferPointer(), signature1->GetBufferSize(), &mInputLayout1);
		MYGUI_PLATFORM_ASSERT(hr == S_OK, "Input Layout Create failed!");

		signature1->Release();

		mUpdate = false;

		MYGUI_PLATFORM_LOG(Info, getClassTypeName() << " successfully initialized");
		mIsInitialise = true;
	}
//Since we're precompiling the shaders, we dont need all the extra parameters
//Assume this is a function within the renderer thus we have access to private render members
Shader* CreateShader(
	const std::string& name,
	const std::string& vsFile,
	const std::string& psFile,
	const std::string& gsFile = "")
{
	Shader newShader = new Shader(name);
	ID3D11ShaderReflection *vsReflect(nullptr);
	ID3D11ShaderReflection *psReflect(nullptr);
	ID3D11ShaderReflection *gsReflect(nullptr);

	if(!vsFile.empty()) {
		auto vsFileRes = new WhaleFile(vsFile);
		if(!vsFileRes) {
			log_sxerror("Shader", "Error opening VS file %s. Cannot continue", vsFile.c_str());
			delete newShader;
			return nullptr;
		}
		auto vsFilePtr = vsFileRes->GetMem();
		HRESULT result = 
			device->CreateVertexShader(vsFilePtr, vsFileRes.Size(), NULL, &newShader->vertexShader);
		if(FAILED(result)) {
			log_sxerror("Shader", "Could not create Vertex shader from %s. Cannot continue!", vsFile.c_str());
			//Clean up after ourselves before returning
			delete vsFileRes;
			delete newShader;
			return nullptr;
		}
		//Grab the input signature from the vertex shader
		result = D3DGetInputSignatureBlob(vsFilePtr, vsFileRes.Size(), &newShader->inputSignature);	
		if(FAILED(result)) {
			log_sxerror("Shader", "Could not get Input signature from %s. Cannot continue!", vsFile.c_str());
			delete vsFileRes;
			delete newShader;
			return nullptr;
		}
		result = D3DReflect(vsFilePtr, vsFileRes.Size(), IID_ID3D11ShaderReflection, (void **)&vsReflect);
		if(FAILED(result)) {
			log_sxerror("Shader", "Could not get Reflection Interface from %s. Cannot continue!", vsFile.c_str());
			delete vsFileRes;
			delete newShader;
			return nullptr;
		}
		delete vsFileRes;
	}
	if(!psFile.empty()) {
		auto psFileRes = new WhaleFile(psFile);
		if(!psFileRes) {
			log_sxerror("Shader", "Error opening PS file %s. Cannot continue!", psFile.c_str());
			delete newShader;
			SAFE_RELEASE(vsReflect);
			return nullptr;
		}
		auto psFilePtr = psFileRes->GetMem();
		HRESULT result =
			device->CreatePixelShader(psFilePtr, psFileRes.Size(), NULL, &newShader->pixelShader);
		if(FAILED(result)) {
			log_sxerror("Shader", "Could not create Pixel shader from %s. Cannot continue!", psFile.c_str());
			delete psFileRes;
			SAFE_RELEASE(vsReflect);
			delete newShader;
			return nullptr;
		}
		result = D3DReflect(psFilePtr, psFileRes.Size(), IID_ID3D11ShaderReflection, (void **)&psReflect);
		if(FAILED(result)) {
			log_sxerror("Shader", "Could not get Reflection Interface from %s. Cannot continue!", psFile.c_str());
			delete psFileRes;
			SAFE_RELEASE(vsReflect);
			delete newShader;
			return nullptr;
		}
		delete psFileRes;
	}
	if(!gsFile.empty()) {
		auto gsFileRes = new WhaleFile(gsFile);
		if(!gsFileRes) {
			log_sxerror("Shader", "Error opening PS file %s. Cannot continue!", gsFile.c_str());
			delete newShader;
			SAFE_RELEASE(vsReflect);
			return nullptr;
		}
		auto gsFilePtr = gsFileRes->GetMem();
		HRESULT result =
			device->CreatePixelShader(gsFilePtr, gsFileRes.Size(), NULL, &newShader->geometryShader);
		if(FAILED(result)) {
			log_sxerror("Shader", "Could not create Pixel shader from %s. Cannot continue!", gsFile.c_str());
			delete gsFileRes;
			SAFE_RELEASE(vsReflect);
			SAFE_RELEASE(psReflect);
			delete newShader;
			return nullptr;
		}
		result = D3DReflect(gsFilePtr, gsFileRes.Size(), IID_ID3D11ShaderReflection, (void **)&gsReflect);
		if(FAILED(result)) {
			log_sxerror("Shader", "Could not get Reflection Interface from %s. Cannot continue!", gsFile.c_str());
			delete gsFileRes;
			SAFE_RELEASE(psReflect);
			SAFE_RELEASE(vsReflect);
			delete newShader;
			return nullptr;
		}
		delete gsFileRes;
	}
	bool res = GenerateShaderConstants(newShader, vsReflect, psReflect, gsReflect);
	if(!res) {
		log_sxerror("Shader", "Error Generating shader constants for shader %s.", name.c_str());
		SAFE_RELEASE(vsReflect);
		SAFE_RELEASE(psReflect);
		SAFE_RELEASE(gsReflect);
		delete newShader;
		return nullptr;
	}
	res = GenerateShaderSamplers(newShader, vsReflect, psReflect, gsReflect);
	if(!res) {
		log_sxerror("Shader", "Error Generating shader samplers for shader %s.", name.c_str());
		SAFE_RELEASE(vsReflect);
		SAFE_RELEASE(psReflect);
		SAFE_RELEASE(gsReflect);
		delete newShader;
		return nullptr;
	}
	res = ValidateShader(newShader, vsReflect, psReflect, gsReflect);
	if(!res) {
		log_sxerror("Shader", "Error validating shader %s", name.c_str());
		delete newShader;
		newShader = nullptr;	
	}
	SAFE_RELEASE(vsReflect);
	SAFE_RELEASE(psReflect);
	SAFE_RELEASE(gsReflect);
	return newShader;
}
示例#3
0
bool HGE_Impl::_GfxInit()
{
	HRESULT hr = S_OK;

#pragma region
	const D3D_FEATURE_LEVEL featureLevels[] = {
		D3D_FEATURE_LEVEL_11_1,
		D3D_FEATURE_LEVEL_11_0,
		D3D_FEATURE_LEVEL_10_1,
		D3D_FEATURE_LEVEL_10_0,
		D3D_FEATURE_LEVEL_9_3,
		D3D_FEATURE_LEVEL_9_2,
		D3D_FEATURE_LEVEL_9_1 };

	UINT               numFeatureLevels = 7;
	D3D_FEATURE_LEVEL  selectedFeatureLevel = D3D_FEATURE_LEVEL_11_0;

	// create swap chain description
	DXGI_SWAP_CHAIN_DESC swapChainDesc;
	ZeroMemory(&swapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC));
	swapChainDesc.BufferCount = 1;                                   // one back buffer
	swapChainDesc.BufferDesc.Width = nScreenWidth;                   // set the back buffer width
	swapChainDesc.BufferDesc.Height = nScreenHeight;                 // set the back buffer height
	swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;    // use 32-bit color
	swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
	swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
	swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;     // how swap chain is to be used
	swapChainDesc.OutputWindow = hwnd;                               // the window to be used
	swapChainDesc.SampleDesc.Count = 1;                              // how many multisamples
	swapChainDesc.SampleDesc.Quality = 0;
	swapChainDesc.Windowed = bWindowed;                              // windowed/full-screen mode
	swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;    // allow full-screen switching

	//Setup debuf flag
#ifdef _DEBUG
	UINT createDeviceFlags = D3D11_CREATE_DEVICE_DEBUG;
#else
	UINT createDeviceFlags = 0;
#endif
	//create device and swapchain
	hr = D3D11CreateDeviceAndSwapChain(
		NULL,
		D3D_DRIVER_TYPE_HARDWARE,
		NULL,
		createDeviceFlags,
		featureLevels,
		numFeatureLevels,
		D3D11_SDK_VERSION,
		&swapChainDesc,
		&m_pSwapChain,
		&m_pD3DDevice,
		&selectedFeatureLevel,
		&m_pD3DDeviceContext);
	if (hr != S_OK)
	{
		_PostError("Can't initialize d3d11.");
		return false;
	}
#pragma endregion init swap chain

#pragma region 
	// Setup render target
	V_RETURN(m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&m_pBackBuffer));
	V_RETURN(m_pD3DDevice->CreateRenderTargetView(m_pBackBuffer, NULL, &pRTView));
	//m_pBackBuffer->Release();

	m_pD3DDeviceContext->OMSetRenderTargets(1, &pRTView, NULL);

	// Setup the viewport
	D3D11_VIEWPORT vp;
	vp.Width = (FLOAT)nScreenWidth;
	vp.Height = (FLOAT)nScreenHeight;
	vp.MinDepth = 0.0f;
	vp.MaxDepth = 1.0f;
	vp.TopLeftX = 0;
	vp.TopLeftY = 0;
	m_pD3DDeviceContext->RSSetViewports(1, &vp);

	/*
	// Create depth stencil texture
	D3D11_TEXTURE2D_DESC descDepth;
	ZeroMemory(&descDepth, sizeof(descDepth));
	descDepth.Width = nScreenWidth;
	descDepth.Height = nScreenHeight;
	descDepth.MipLevels = 1;
	descDepth.ArraySize = 1;
	descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
	descDepth.SampleDesc.Count = 1;
	descDepth.SampleDesc.Quality = 0;
	descDepth.Usage = D3D11_USAGE_DEFAULT;
	descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL;
	descDepth.CPUAccessFlags = 0;
	descDepth.MiscFlags = 0;
	hr = m_pDevice->CreateTexture2D(&descDepth, NULL, &m_pDepthBuffer);
	if (FAILED(hr))
	return hr;

	// Create the depth stencil view
	D3D11_DEPTH_STENCIL_VIEW_DESC descDSV;
	ZeroMemory(&descDSV, sizeof(descDSV));
	descDSV.Format = descDepth.Format;
	descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
	descDSV.Texture2D.MipSlice = 0;
	hr = m_pDevice->CreateDepthStencilView(m_pDepthBuffer, &descDSV, &pDSView);
	if (FAILED(hr))
	return hr;
	*/
	//m_pDeviceContext->OMSetRenderTargets(1, &pRTView, pDSView);
#pragma endregion setup render targets & viewport

#pragma region
	std::string vertexProfile, pixelProfile;
	if (m_pD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_11_0)
	{
		vertexProfile = "vs_5_0";
		pixelProfile = "ps_5_0";
	}
	else if (m_pD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_10_1)
	{
		vertexProfile = "vs_4_1";
		pixelProfile = "ps_4_1";
	}
	else if (m_pD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_10_0)
	{
		vertexProfile = "vs_4_0";
		pixelProfile = "ps_4_0";
	}
	else if (m_pD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_9_3)
	{
		vertexProfile = "vs_4_0_level_9_3";
		pixelProfile = "ps_4_0_level_9_3";
	}
	else if (m_pD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_9_2)
	{
		vertexProfile = "vs_4_0_level_9_1";
		pixelProfile = "ps_4_0_level_9_1";
	}
	else if (m_pD3DDevice->GetFeatureLevel() == D3D_FEATURE_LEVEL_9_1)
	{
		vertexProfile = "vs_4_0_level_9_1";
		pixelProfile = "ps_4_0_level_9_1";
	}

	//D3DCOMPILE_OPTIMIZATION_LEVEL3 &
	//D3DCOMPILE_ENABLE_STRICTNESS
	UINT flags = (1 << 11) | (1 << 15);


	// Build Flat Vertex Shader
	ID3DBlob* binarycode = 0, *errors = 0, *signature0 = 0, *signature1 = 0;
	V_RETURN(D3DCompile(vsSource, strlen(vsSource), "VertexShader0", 0, 0, "main", vertexProfile.c_str(), flags, 0, &binarycode, &errors));

	V_RETURN(D3DGetInputSignatureBlob(binarycode->GetBufferPointer(), binarycode->GetBufferSize(), &signature0));


	V_RETURN(m_pD3DDevice->CreateVertexShader(binarycode->GetBufferPointer(), binarycode->GetBufferSize(), 0, &m_pVS0));

	if (binarycode) binarycode->Release();
	if (errors) errors->Release();

	// Build Textured Vertex Shader
	binarycode = 0;
	errors = 0;
	V_RETURN(D3DCompile(vsTexturedSource, strlen(vsTexturedSource), "VertexShader1", 0, 0, "main", vertexProfile.c_str(), flags, 0, &binarycode, &errors));

	V_RETURN(D3DGetInputSignatureBlob(binarycode->GetBufferPointer(), binarycode->GetBufferSize(), &signature1));

	V_RETURN(m_pD3DDevice->CreateVertexShader(binarycode->GetBufferPointer(), binarycode->GetBufferSize(), 0, &m_pVS1));

	if (binarycode) binarycode->Release();
	if (errors) errors->Release();

	// Build Flat Pixel Shader
	binarycode = 0;
	errors = 0;
	V_RETURN(D3DCompile(psSource, strlen(psSource), "PixelShader0", 0, 0, "main", pixelProfile.c_str(), flags, 0, &binarycode, &errors));

	V_RETURN(m_pD3DDevice->CreatePixelShader(binarycode->GetBufferPointer(), binarycode->GetBufferSize(), 0, &m_pPS0));

	if (binarycode) binarycode->Release();
	if (errors) errors->Release();

	// Build Textured Pixel Shader
	binarycode = 0;
	errors = 0;
	V_RETURN(D3DCompile(psTexturedSource, strlen(psTexturedSource), "PixelShader1", 0, 0, "main", pixelProfile.c_str(), flags, 0, &binarycode, &errors));

	V_RETURN(m_pD3DDevice->CreatePixelShader(binarycode->GetBufferPointer(), binarycode->GetBufferSize(), 0, &m_pPS1));

	if (binarycode) binarycode->Release();
	if (errors) errors->Release();


	// Compile the shaders using the lowest possible profile for broadest feature level support
	// 	ID3DBlob* pVertexShaderBuffer = NULL;
	// 	V_RETURN(CompileShaderFromFile(TEXT("BasicHLSL11_VS.hlsl"), "VSMain", vertexProfile.c_str(), &pVertexShaderBuffer));
	// 
	// 	ID3DBlob* pPixelShaderBuffer = NULL;
	// 	V_RETURN(CompileShaderFromFile(TEXT("BasicHLSL11_PS.hlsl"), "PSMain", pixelProfile.c_str(), &pPixelShaderBuffer));
	// 
	// 	// Create the shaders
	// 	V_RETURN(m_pD3DDevice->CreateVertexShader(pVertexShaderBuffer->GetBufferPointer(),
	// 		pVertexShaderBuffer->GetBufferSize(), NULL, &pVS0));
	// 	V_RETURN(m_pD3DDevice->CreatePixelShader(pPixelShaderBuffer->GetBufferPointer(),
	// 		pPixelShaderBuffer->GetBufferSize(), NULL, &pPS0));

	// Create Input Layout
	V_RETURN(m_pD3DDevice->CreateInputLayout(vertexLayout, 3, signature0->GetBufferPointer(), signature0->GetBufferSize(), &m_pInputLayout0));
	signature0->Release();

	// Create Input Layout
	V_RETURN(m_pD3DDevice->CreateInputLayout(vertexLayout, 3, signature1->GetBufferPointer(), signature1->GetBufferSize(), &m_pInputLayout1));
	signature1->Release();

#pragma endregion create shaders and input layout

#pragma region
	// Setup constant buffers
	D3D11_BUFFER_DESC desc;
	desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
	desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
	desc.MiscFlags = 0;
	desc.StructureByteStride = 0;
	desc.ByteWidth = sizeof(hgeVertex)* (VERTEX_BUFFER_SIZE);
	desc.Usage = D3D11_USAGE_DYNAMIC;
	V_RETURN(m_pD3DDevice->CreateBuffer(&desc, NULL, &m_pVertexBuf));

	// 	D3D11_BUFFER_DESC desc;
	// 	desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
	// 	desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
	// 	desc.MiscFlags = 0;
	// 	desc.StructureByteStride = 0;
	// 	desc.ByteWidth = 6 * (VERTEX_BUFFER_SIZE/4) * sizeof(uint16_t);
	// 	desc.Usage = D3D11_USAGE_DYNAMIC;
	// 	V_RETURN(m_pD3DDevice->CreateBuffer(&desc, NULL, &m_pIndexBuf));
	// 
	// 	for (int i = 0; i < VERTEX_BUFFER_SIZE / 4; i++)
	// 	{
	// 		*pIndices++ = n;
	// 		*pIndices++ = n + 1;
	// 		*pIndices++ = n + 2;
	// 		*pIndices++ = n + 2;
	// 		*pIndices++ = n + 3;
	// 		*pIndices++ = n;
	// 		n += 4;
	// 	}
	// 
	// 	m_pD3DDeviceContext->IASetIndexBuffer(m_pIndexBuf, DXGI_FORMAT_R16_UINT, 0);
	D3D11_BUFFER_DESC Desc;
	Desc.Usage = D3D11_USAGE_DYNAMIC;
	Desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
	Desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
	Desc.MiscFlags = 0;
	Desc.ByteWidth = sizeof(CB_VS_PER_OBJECT);
	V_RETURN(m_pD3DDevice->CreateBuffer(&Desc, NULL, &g_pcbVSPerObject));
	Desc.ByteWidth = sizeof(CB_PS_PER_OBJECT);
	V_RETURN(m_pD3DDevice->CreateBuffer(&Desc, NULL, &g_pcbPSPerObject));
	Desc.ByteWidth = sizeof(CB_PS_PER_FRAME);
	V_RETURN(m_pD3DDevice->CreateBuffer(&Desc, NULL, &g_pcbPSPerFrame));
#pragma endregion setup constant buffers

	// Create Sampler State
	D3D11_SAMPLER_DESC samplerDesc;
	samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
	samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
	samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
	samplerDesc.BorderColor[0] = samplerDesc.BorderColor[1] = samplerDesc.BorderColor[2] = samplerDesc.BorderColor[3] = 0.0f;
	samplerDesc.ComparisonFunc = (D3D11_COMPARISON_FUNC)0;
	samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
	samplerDesc.MaxAnisotropy = 1.0f;
	samplerDesc.MaxLOD = 0; //D3D11_FLOAT32_MAX
	samplerDesc.MinLOD = 0;
	samplerDesc.MipLODBias = 0.0f;
	V_RETURN(m_pD3DDevice->CreateSamplerState(&samplerDesc, &m_pSamplerState));

	// Create Blend State
	D3D11_BLEND_DESC blendDesc;
	blendDesc.AlphaToCoverageEnable = false;
	blendDesc.IndependentBlendEnable = false;
	blendDesc.RenderTarget[0].BlendEnable = true;
	blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
	blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
	blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
	blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
	blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
	blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
	blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
	V_RETURN(m_pD3DDevice->CreateBlendState(&blendDesc, &m_pBlendState));

	// Create Depth Stencil State
	D3D11_DEPTH_STENCIL_DESC depthDesc;
	depthDesc.DepthEnable = false;
	depthDesc.DepthFunc = D3D11_COMPARISON_ALWAYS;
	depthDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO;
	depthDesc.StencilEnable = false;
	depthDesc.StencilReadMask = depthDesc.StencilWriteMask = 0;
	depthDesc.BackFace.StencilDepthFailOp = depthDesc.BackFace.StencilFailOp = depthDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
	depthDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
	depthDesc.FrontFace = depthDesc.BackFace;
	V_RETURN(m_pD3DDevice->CreateDepthStencilState(&depthDesc, &m_pDepthStencilState));

	// Create Rasterizer State
	D3D11_RASTERIZER_DESC rastDesc;
	rastDesc.FillMode = D3D11_FILL_SOLID;
	rastDesc.CullMode = D3D11_CULL_NONE;
	rastDesc.FrontCounterClockwise = FALSE;
	rastDesc.DepthBias = 0;
	rastDesc.DepthBiasClamp = 0;
	rastDesc.SlopeScaledDepthBias = 0;
	rastDesc.ScissorEnable = FALSE;
	rastDesc.MultisampleEnable = FALSE;
	rastDesc.AntialiasedLineEnable = FALSE;
	hr = m_pD3DDevice->CreateRasterizerState(&rastDesc, &m_pRasterizerState);

	// 	mUpdate = false;
	// 
	// 	mIsInitialise = true;

	// Setup the camera's view parameters
	// 	D3DXVECTOR3 vecEye(0.0f, 0.0f, -100.0f);
	// 	D3DXVECTOR3 vecAt(0.0f, 0.0f, -0.0f);
	// 	g_Camera.SetViewParams(&vecEye, &vecAt);
	// 	g_Camera.SetRadius(fObjectRadius * 3.0f, fObjectRadius * 0.5f, fObjectRadius * 10.0f);

	//return S_OK;

	// Get adapter info
	// 	auto adapterList = EnumerateAdapters();
	// 	for (auto it = adapterList.begin(); it != adapterList.end(); it++)
	// 	{
	// 		System_Log("D3D Driver: %s", "123123123123123");
	// 		DXGI_ADAPTER_DESC desc;
	// 		(*it)->GetDesc(&desc);
	// 		System_Log("Description: %s", desc.Description);
	// 
	// 	}

	m_prim_count = 0;
	m_cur_prim_type = HGEPRIM_QUADS;
	m_cur_blend_mode = BLEND_DEFAULT;

	//todo: test those functions
	_AdjustWindow();

	System_Log("Screen Resolution: %d x %d\n", nScreenWidth, nScreenHeight);

	_SetProjectionMatrix(nScreenWidth, nScreenHeight);

	if (!_init_lost()) return false;

	Gfx_Clear(0);

	return true;
}