|
|
|
@ -29,8 +29,7 @@ static ID3D11SamplerState* g_pFontSampler = NULL; |
|
|
|
|
static ID3D11ShaderResourceView*g_pFontTextureView = NULL; |
|
|
|
|
static ID3D11RasterizerState* g_pRasterizerState = NULL; |
|
|
|
|
static ID3D11BlendState* g_pBlendState = NULL; |
|
|
|
|
static int VERTEX_BUFFER_SIZE = 20000; // TODO: Make buffers smaller and grow dynamically as needed.
|
|
|
|
|
static int INDEX_BUFFER_SIZE = 40000; // TODO: Make buffers smaller and grow dynamically as needed.
|
|
|
|
|
static int g_VertexBufferSize = 5000, g_IndexBufferSize = 10000; |
|
|
|
|
|
|
|
|
|
struct VERTEX_CONSTANT_BUFFER |
|
|
|
|
{ |
|
|
|
@ -42,6 +41,35 @@ struct VERTEX_CONSTANT_BUFFER |
|
|
|
|
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
|
|
|
|
|
static void ImGui_ImplDX11_RenderDrawLists(ImDrawData* draw_data) |
|
|
|
|
{ |
|
|
|
|
// Create and grow vertex/index buffers if needed
|
|
|
|
|
if (!g_pVB || g_VertexBufferSize < draw_data->TotalVtxCount) |
|
|
|
|
{ |
|
|
|
|
if (g_pVB) { g_pVB->Release(); g_pVB = NULL; } |
|
|
|
|
g_VertexBufferSize = draw_data->TotalVtxCount + 5000; |
|
|
|
|
D3D11_BUFFER_DESC desc; |
|
|
|
|
memset(&desc, 0, sizeof(D3D11_BUFFER_DESC)); |
|
|
|
|
desc.Usage = D3D11_USAGE_DYNAMIC; |
|
|
|
|
desc.ByteWidth = g_VertexBufferSize * sizeof(ImDrawVert); |
|
|
|
|
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; |
|
|
|
|
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; |
|
|
|
|
desc.MiscFlags = 0; |
|
|
|
|
if (g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVB) < 0) |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (!g_pIB || g_IndexBufferSize < draw_data->TotalIdxCount) |
|
|
|
|
{ |
|
|
|
|
if (g_pIB) { g_pIB->Release(); g_pIB = NULL; } |
|
|
|
|
g_IndexBufferSize = draw_data->TotalIdxCount + 10000; |
|
|
|
|
D3D11_BUFFER_DESC bufferDesc; |
|
|
|
|
memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); |
|
|
|
|
bufferDesc.Usage = D3D11_USAGE_DYNAMIC; |
|
|
|
|
bufferDesc.ByteWidth = g_IndexBufferSize * sizeof(ImDrawIdx); |
|
|
|
|
bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; |
|
|
|
|
bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; |
|
|
|
|
if (g_pd3dDevice->CreateBuffer(&bufferDesc, NULL, &g_pIB) < 0) |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Copy and convert all vertices into a single contiguous buffer
|
|
|
|
|
D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource; |
|
|
|
|
if (g_pd3dDeviceContext->Map(g_pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK) |
|
|
|
@ -253,7 +281,7 @@ bool ImGui_ImplDX11_CreateDeviceObjects() |
|
|
|
|
{ |
|
|
|
|
if (!g_pd3dDevice) |
|
|
|
|
return false; |
|
|
|
|
if (g_pVB) |
|
|
|
|
if (g_pFontSampler) |
|
|
|
|
ImGui_ImplDX11_InvalidateDeviceObjects(); |
|
|
|
|
|
|
|
|
|
// Create the vertex shader
|
|
|
|
@ -366,31 +394,6 @@ bool ImGui_ImplDX11_CreateDeviceObjects() |
|
|
|
|
g_pd3dDevice->CreateRasterizerState(&desc, &g_pRasterizerState); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Create the vertex buffer
|
|
|
|
|
{ |
|
|
|
|
D3D11_BUFFER_DESC desc; |
|
|
|
|
memset(&desc, 0, sizeof(D3D11_BUFFER_DESC)); |
|
|
|
|
desc.Usage = D3D11_USAGE_DYNAMIC; |
|
|
|
|
desc.ByteWidth = VERTEX_BUFFER_SIZE * sizeof(ImDrawVert); |
|
|
|
|
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; |
|
|
|
|
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; |
|
|
|
|
desc.MiscFlags = 0; |
|
|
|
|
if (g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVB) < 0) |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Create the index buffer
|
|
|
|
|
{ |
|
|
|
|
D3D11_BUFFER_DESC bufferDesc; |
|
|
|
|
memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); |
|
|
|
|
bufferDesc.Usage = D3D11_USAGE_DYNAMIC; |
|
|
|
|
bufferDesc.ByteWidth = INDEX_BUFFER_SIZE * sizeof(ImDrawIdx); |
|
|
|
|
bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; |
|
|
|
|
bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; |
|
|
|
|
if (g_pd3dDevice->CreateBuffer(&bufferDesc, NULL, &g_pIB) < 0) |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ImGui_ImplDX11_CreateFontsTexture(); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|