|
|
|
@ -13,7 +13,6 @@ |
|
|
|
|
// Data
|
|
|
|
|
static INT64 g_Time = 0; |
|
|
|
|
static INT64 g_TicksPerSecond = 0; |
|
|
|
|
static bool g_FontTextureLoaded = false; |
|
|
|
|
|
|
|
|
|
static HWND g_hWnd = 0; |
|
|
|
|
static ID3D11Device* g_pd3dDevice = NULL; |
|
|
|
@ -26,6 +25,7 @@ static ID3D11Buffer* g_pVertexConstantBuffer = NULL; |
|
|
|
|
static ID3D10Blob * g_pPixelShaderBlob = NULL; |
|
|
|
|
static ID3D11PixelShader* g_pPixelShader = NULL; |
|
|
|
|
static ID3D11SamplerState* g_pFontSampler = NULL; |
|
|
|
|
static ID3D11ShaderResourceView*g_pFontTextureView = NULL; |
|
|
|
|
static ID3D11BlendState* g_blendState = NULL; |
|
|
|
|
|
|
|
|
|
struct CUSTOMVERTEX |
|
|
|
@ -180,7 +180,7 @@ LRESULT ImGui_ImplDX11_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ImGui_ImplDX11_InitFontsTexture() |
|
|
|
|
static void ImGui_ImplDX11_InitFontsTexture() |
|
|
|
|
{ |
|
|
|
|
ImGuiIO& io = ImGui::GetIO(); |
|
|
|
|
|
|
|
|
@ -190,55 +190,63 @@ void ImGui_ImplDX11_InitFontsTexture() |
|
|
|
|
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); |
|
|
|
|
|
|
|
|
|
// Create DX11 texture
|
|
|
|
|
D3D11_TEXTURE2D_DESC texDesc; |
|
|
|
|
ZeroMemory(&texDesc, sizeof(texDesc)); |
|
|
|
|
texDesc.Width = width; |
|
|
|
|
texDesc.Height = height; |
|
|
|
|
texDesc.MipLevels = 1; |
|
|
|
|
texDesc.ArraySize = 1; |
|
|
|
|
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; |
|
|
|
|
texDesc.SampleDesc.Count = 1; |
|
|
|
|
texDesc.Usage = D3D11_USAGE_DEFAULT; |
|
|
|
|
texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; |
|
|
|
|
texDesc.CPUAccessFlags = 0; |
|
|
|
|
|
|
|
|
|
ID3D11Texture2D *pTexture = NULL; |
|
|
|
|
D3D11_SUBRESOURCE_DATA subResource; |
|
|
|
|
subResource.pSysMem = pixels; |
|
|
|
|
subResource.SysMemPitch = texDesc.Width * 4; |
|
|
|
|
subResource.SysMemSlicePitch = 0; |
|
|
|
|
g_pd3dDevice->CreateTexture2D(&texDesc, &subResource, &pTexture); |
|
|
|
|
|
|
|
|
|
// Create texture view
|
|
|
|
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; |
|
|
|
|
ZeroMemory(&srvDesc, sizeof(srvDesc)); |
|
|
|
|
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; |
|
|
|
|
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; |
|
|
|
|
srvDesc.Texture2D.MipLevels = texDesc.MipLevels; |
|
|
|
|
srvDesc.Texture2D.MostDetailedMip = 0; |
|
|
|
|
ID3D11ShaderResourceView* font_texture_view = NULL; |
|
|
|
|
g_pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &font_texture_view); |
|
|
|
|
pTexture->Release(); |
|
|
|
|
{ |
|
|
|
|
D3D11_TEXTURE2D_DESC texDesc; |
|
|
|
|
ZeroMemory(&texDesc, sizeof(texDesc)); |
|
|
|
|
texDesc.Width = width; |
|
|
|
|
texDesc.Height = height; |
|
|
|
|
texDesc.MipLevels = 1; |
|
|
|
|
texDesc.ArraySize = 1; |
|
|
|
|
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; |
|
|
|
|
texDesc.SampleDesc.Count = 1; |
|
|
|
|
texDesc.Usage = D3D11_USAGE_DEFAULT; |
|
|
|
|
texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; |
|
|
|
|
texDesc.CPUAccessFlags = 0; |
|
|
|
|
|
|
|
|
|
ID3D11Texture2D *pTexture = NULL; |
|
|
|
|
D3D11_SUBRESOURCE_DATA subResource; |
|
|
|
|
subResource.pSysMem = pixels; |
|
|
|
|
subResource.SysMemPitch = texDesc.Width * 4; |
|
|
|
|
subResource.SysMemSlicePitch = 0; |
|
|
|
|
g_pd3dDevice->CreateTexture2D(&texDesc, &subResource, &pTexture); |
|
|
|
|
|
|
|
|
|
// Create texture view
|
|
|
|
|
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; |
|
|
|
|
ZeroMemory(&srvDesc, sizeof(srvDesc)); |
|
|
|
|
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; |
|
|
|
|
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; |
|
|
|
|
srvDesc.Texture2D.MipLevels = texDesc.MipLevels; |
|
|
|
|
srvDesc.Texture2D.MostDetailedMip = 0; |
|
|
|
|
g_pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &g_pFontTextureView); |
|
|
|
|
pTexture->Release(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Store our identifier
|
|
|
|
|
io.Fonts->TexID = (void *)font_texture_view; |
|
|
|
|
io.Fonts->TexID = (void *)g_pFontTextureView; |
|
|
|
|
|
|
|
|
|
// Create texture sampler
|
|
|
|
|
D3D11_SAMPLER_DESC samplerDesc; |
|
|
|
|
ZeroMemory(&samplerDesc, sizeof(samplerDesc)); |
|
|
|
|
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; |
|
|
|
|
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; |
|
|
|
|
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; |
|
|
|
|
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; |
|
|
|
|
samplerDesc.MipLODBias = 0.f; |
|
|
|
|
samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; |
|
|
|
|
samplerDesc.MinLOD = 0.f; |
|
|
|
|
samplerDesc.MaxLOD = 0.f; |
|
|
|
|
g_pd3dDevice->CreateSamplerState(&samplerDesc, &g_pFontSampler); |
|
|
|
|
{ |
|
|
|
|
D3D11_SAMPLER_DESC samplerDesc; |
|
|
|
|
ZeroMemory(&samplerDesc, sizeof(samplerDesc)); |
|
|
|
|
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; |
|
|
|
|
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; |
|
|
|
|
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; |
|
|
|
|
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; |
|
|
|
|
samplerDesc.MipLODBias = 0.f; |
|
|
|
|
samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; |
|
|
|
|
samplerDesc.MinLOD = 0.f; |
|
|
|
|
samplerDesc.MaxLOD = 0.f; |
|
|
|
|
g_pd3dDevice->CreateSamplerState(&samplerDesc, &g_pFontSampler); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static bool InitDirect3DState() |
|
|
|
|
bool ImGui_ImplDX11_CreateDeviceObjects() |
|
|
|
|
{ |
|
|
|
|
if (!g_pd3dDevice) |
|
|
|
|
return false; |
|
|
|
|
if (g_pVB) |
|
|
|
|
ImGui_ImplDX11_InvalidateDeviceObjects(); |
|
|
|
|
|
|
|
|
|
// Create the vertex shader
|
|
|
|
|
{ |
|
|
|
|
static const char* vertexShader =
|
|
|
|
@ -351,21 +359,35 @@ static bool InitDirect3DState() |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ImGui_ImplDX11_InitFontsTexture(); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ImGui_ImplDX11_InvalidateDeviceObjects() |
|
|
|
|
{ |
|
|
|
|
if (!g_pd3dDevice) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
if (g_pFontSampler) { g_pFontSampler->Release(); g_pFontSampler = NULL; } |
|
|
|
|
if (g_pFontTextureView) { g_pFontTextureView->Release(); ImGui::GetIO().Fonts->TexID = 0; } |
|
|
|
|
if (g_pVB) { g_pVB->Release(); g_pVB = NULL; } |
|
|
|
|
|
|
|
|
|
if (g_blendState) { g_blendState->Release(); g_blendState = NULL; } |
|
|
|
|
if (g_pPixelShader) { g_pPixelShader->Release(); g_pPixelShader = NULL; } |
|
|
|
|
if (g_pPixelShaderBlob) { g_pPixelShaderBlob->Release(); g_pPixelShaderBlob = NULL; } |
|
|
|
|
if (g_pVertexConstantBuffer) { g_pVertexConstantBuffer->Release(); g_pVertexConstantBuffer = NULL; } |
|
|
|
|
if (g_pInputLayout) { g_pInputLayout->Release(); g_pInputLayout = NULL; } |
|
|
|
|
if (g_pVertexShader) { g_pVertexShader->Release(); g_pVertexShader = NULL; } |
|
|
|
|
if (g_pVertexShaderBlob) { g_pVertexShaderBlob->Release(); g_pVertexShaderBlob = NULL; } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool ImGui_ImplDX11_Init(void* hwnd, ID3D11Device* device, ID3D11DeviceContext* device_context) |
|
|
|
|
{ |
|
|
|
|
g_hWnd = (HWND)hwnd; |
|
|
|
|
g_pd3dDevice = device; |
|
|
|
|
g_pd3dDeviceContext = device_context; |
|
|
|
|
|
|
|
|
|
if (!InitDirect3DState()) |
|
|
|
|
{ |
|
|
|
|
IM_ASSERT(0); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!QueryPerformanceFrequency((LARGE_INTEGER *)&g_TicksPerSecond))
|
|
|
|
|
return false; |
|
|
|
|
if (!QueryPerformanceCounter((LARGE_INTEGER *)&g_Time)) |
|
|
|
@ -398,28 +420,17 @@ bool ImGui_ImplDX11_Init(void* hwnd, ID3D11Device* device, ID3D11DeviceContex |
|
|
|
|
|
|
|
|
|
void ImGui_ImplDX11_Shutdown() |
|
|
|
|
{ |
|
|
|
|
if (g_pd3dDeviceContext) g_pd3dDeviceContext->ClearState(); |
|
|
|
|
|
|
|
|
|
if (g_pFontSampler) g_pFontSampler->Release(); |
|
|
|
|
if (ID3D11ShaderResourceView* font_texture_view = (ID3D11ShaderResourceView*)ImGui::GetIO().Fonts->TexID) |
|
|
|
|
font_texture_view->Release(); |
|
|
|
|
if (g_pVB) g_pVB->Release(); |
|
|
|
|
|
|
|
|
|
if (g_blendState) g_blendState->Release();
|
|
|
|
|
if (g_pPixelShader) g_pPixelShader->Release(); |
|
|
|
|
if (g_pPixelShaderBlob) g_pPixelShaderBlob->Release(); |
|
|
|
|
if (g_pVertexConstantBuffer) g_pVertexConstantBuffer->Release(); |
|
|
|
|
if (g_pInputLayout) g_pInputLayout->Release(); |
|
|
|
|
if (g_pVertexShader) g_pVertexShader->Release(); |
|
|
|
|
if (g_pVertexShaderBlob) g_pVertexShaderBlob->Release(); |
|
|
|
|
|
|
|
|
|
ImGui_ImplDX11_InvalidateDeviceObjects(); |
|
|
|
|
ImGui::Shutdown(); |
|
|
|
|
g_pd3dDevice = NULL; |
|
|
|
|
g_pd3dDeviceContext = NULL; |
|
|
|
|
g_hWnd = (HWND)0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ImGui_ImplDX11_NewFrame() |
|
|
|
|
{ |
|
|
|
|
if (!g_FontTextureLoaded) |
|
|
|
|
ImGui_ImplDX11_InitFontsTexture(); |
|
|
|
|
if (!g_pVB) |
|
|
|
|
ImGui_ImplDX11_CreateDeviceObjects(); |
|
|
|
|
|
|
|
|
|
ImGuiIO& io = ImGui::GetIO(); |
|
|
|
|
|
|
|
|
|