|
@@ -14,6 +14,7 @@
|
|
|
|
|
|
// CHANGELOG
|
|
// CHANGELOG
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
|
+// 2019-02-16: Vulkan: Viewport and clipping rectangles correctly using draw_data->FramebufferScale to allow retina display.
|
|
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
|
|
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
|
|
// 2018-08-25: Vulkan: Fixed mishandled VkSurfaceCapabilitiesKHR::maxImageCount=0 case.
|
|
// 2018-08-25: Vulkan: Fixed mishandled VkSurfaceCapabilitiesKHR::maxImageCount=0 case.
|
|
// 2018-06-22: Inverted the parameters to ImGui_ImplVulkan_RenderDrawData() to be consistent with other bindings.
|
|
// 2018-06-22: Inverted the parameters to ImGui_ImplVulkan_RenderDrawData() to be consistent with other bindings.
|
|
@@ -207,10 +208,13 @@ static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory
|
|
// (this used to be set in io.RenderDrawListsFn and called by ImGui::Render(), but you can now call this directly from your main loop)
|
|
// (this used to be set in io.RenderDrawListsFn and called by ImGui::Render(), but you can now call this directly from your main loop)
|
|
void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer)
|
|
void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer)
|
|
{
|
|
{
|
|
- VkResult err;
|
|
|
|
- if (draw_data->TotalVtxCount == 0)
|
|
|
|
|
|
+ // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
|
|
|
|
+ int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
|
|
|
|
+ int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
|
|
|
|
+ if (fb_width <= 0 || fb_height <= 0 || draw_data->TotalVtxCount == 0)
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
+ VkResult err;
|
|
FrameDataForRender* fd = &g_FramesDataBuffers[g_FrameIndex];
|
|
FrameDataForRender* fd = &g_FramesDataBuffers[g_FrameIndex];
|
|
g_FrameIndex = (g_FrameIndex + 1) % IMGUI_VK_QUEUED_FRAMES;
|
|
g_FrameIndex = (g_FrameIndex + 1) % IMGUI_VK_QUEUED_FRAMES;
|
|
|
|
|
|
@@ -271,8 +275,8 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm
|
|
VkViewport viewport;
|
|
VkViewport viewport;
|
|
viewport.x = 0;
|
|
viewport.x = 0;
|
|
viewport.y = 0;
|
|
viewport.y = 0;
|
|
- viewport.width = draw_data->DisplaySize.x;
|
|
|
|
- viewport.height = draw_data->DisplaySize.y;
|
|
|
|
|
|
+ viewport.width = (float)fb_width;
|
|
|
|
+ viewport.height = (float)fb_height;
|
|
viewport.minDepth = 0.0f;
|
|
viewport.minDepth = 0.0f;
|
|
viewport.maxDepth = 1.0f;
|
|
viewport.maxDepth = 1.0f;
|
|
vkCmdSetViewport(command_buffer, 0, 1, &viewport);
|
|
vkCmdSetViewport(command_buffer, 0, 1, &viewport);
|
|
@@ -291,10 +295,13 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm
|
|
vkCmdPushConstants(command_buffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 2, sizeof(float) * 2, translate);
|
|
vkCmdPushConstants(command_buffer, g_PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 2, sizeof(float) * 2, translate);
|
|
}
|
|
}
|
|
|
|
|
|
- // Render the command lists:
|
|
|
|
|
|
+ // Will project scissor/clipping rectangles into framebuffer space
|
|
|
|
+ ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
|
|
|
|
+ ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2)
|
|
|
|
+
|
|
|
|
+ // Render command lists
|
|
int vtx_offset = 0;
|
|
int vtx_offset = 0;
|
|
int idx_offset = 0;
|
|
int idx_offset = 0;
|
|
- ImVec2 clip_off = draw_data->DisplayPos;
|
|
|
|
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
|
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
|
{
|
|
{
|
|
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
|
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
|
@@ -307,17 +314,26 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- // Apply scissor/clipping rectangle
|
|
|
|
- // FIXME: We could clamp width/height based on clamped min/max values.
|
|
|
|
- VkRect2D scissor;
|
|
|
|
- scissor.offset.x = (int32_t)(pcmd->ClipRect.x - clip_off.x) > 0 ? (int32_t)(pcmd->ClipRect.x - clip_off.x) : 0;
|
|
|
|
- scissor.offset.y = (int32_t)(pcmd->ClipRect.y - clip_off.y) > 0 ? (int32_t)(pcmd->ClipRect.y - clip_off.y) : 0;
|
|
|
|
- scissor.extent.width = (uint32_t)(pcmd->ClipRect.z - pcmd->ClipRect.x);
|
|
|
|
- scissor.extent.height = (uint32_t)(pcmd->ClipRect.w - pcmd->ClipRect.y + 1); // FIXME: Why +1 here?
|
|
|
|
- vkCmdSetScissor(command_buffer, 0, 1, &scissor);
|
|
|
|
-
|
|
|
|
- // Draw
|
|
|
|
- vkCmdDrawIndexed(command_buffer, pcmd->ElemCount, 1, idx_offset, vtx_offset, 0);
|
|
|
|
|
|
+ // Project scissor/clipping rectangles into framebuffer space
|
|
|
|
+ ImVec4 clip_rect;
|
|
|
|
+ clip_rect.x = (pcmd->ClipRect.x - clip_off.x) * clip_scale.x;
|
|
|
|
+ clip_rect.y = (pcmd->ClipRect.y - clip_off.y) * clip_scale.y;
|
|
|
|
+ clip_rect.z = (pcmd->ClipRect.z - clip_off.x) * clip_scale.x;
|
|
|
|
+ clip_rect.w = (pcmd->ClipRect.w - clip_off.y) * clip_scale.y;
|
|
|
|
+
|
|
|
|
+ if (clip_rect.x < fb_width && clip_rect.y < fb_height && clip_rect.z >= 0.0f && clip_rect.w >= 0.0f)
|
|
|
|
+ {
|
|
|
|
+ // Apply scissor/clipping rectangle
|
|
|
|
+ VkRect2D scissor;
|
|
|
|
+ scissor.offset.x = (int32_t)(clip_rect.x);
|
|
|
|
+ scissor.offset.y = (int32_t)(clip_rect.y);
|
|
|
|
+ scissor.extent.width = (uint32_t)(clip_rect.z - clip_rect.x);
|
|
|
|
+ scissor.extent.height = (uint32_t)(clip_rect.w - clip_rect.y);
|
|
|
|
+ vkCmdSetScissor(command_buffer, 0, 1, &scissor);
|
|
|
|
+
|
|
|
|
+ // Draw
|
|
|
|
+ vkCmdDrawIndexed(command_buffer, pcmd->ElemCount, 1, idx_offset, vtx_offset, 0);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
idx_offset += pcmd->ElemCount;
|
|
idx_offset += pcmd->ElemCount;
|
|
}
|
|
}
|