Commit ea83a1d3 authored by Lionel Landwerlin's avatar Lionel Landwerlin

intel: tools: import ImGui

We want to add a new UI tool to decode aub files. This will use the
Dear ImGui library to render its interface. The build of this UI
toolkit is conditional to -Dwith_tools=intel-ui which superseeds
-Dwith_tools=intel.

The main way to use ImGui is to embed its source code at a particular
revision. Most embedding projects have to do a bit of integration
which is really specific to one's project. In our case the only
modification is to include libepoxy. We also choose to use Gtk+3 for
the window system integration. As oppose to the previous previous
version of this patch using GLFW, Gtk+ is able to handle X11/Wayland
session as well as property DPI scaling on retina monitors.

The import was done at this commit (https://github.com/ocornut/imgui) :

commit 6211f40f3d903dd9df961256e044029c49793aa3
Author: omar <omarcornut@gmail.com>
Date:   Fri Jul 27 12:29:33 2018 +0200

    Internals: Drag and Drop: default drop preview use a narrower clipping rectangle (no effect here, but other branches uses a narrow clipping rectangle that was too small so this is a fix for it) + Comments

v2: Switch from GLFW to GTK+ (Lionel)
Signed-off-by: 's avatarLionel Landwerlin <lionel.g.landwerlin@intel.com>
Acked-by: 's avatarRafael Antognolli <rafael.antognolli@intel.com>
parent 4ba12e8c
......@@ -295,7 +295,7 @@ option(
'tools',
type : 'array',
value : [],
choices : ['freedreno', 'glsl', 'intel', 'nir', 'nouveau', 'xvmc', 'all'],
choices : ['freedreno', 'glsl', 'intel', 'intel-ui', 'nir', 'nouveau', 'xvmc', 'all'],
description : 'List of tools to build.',
)
option(
......
......@@ -69,6 +69,22 @@ EXTRA_DIST = \
dev/meson.build \
genxml/meson.build \
isl/meson.build \
tools/imgui/README \
tools/imgui/stb_textedit.h \
tools/imgui/meson.build \
tools/imgui/imconfig.h \
tools/imgui/imgui.cpp \
tools/imgui/imgui.h \
tools/imgui/imgui_draw.cpp \
tools/imgui/imgui_demo.cpp \
tools/imgui/imgui_internal.h \
tools/imgui/imgui_impl_gtk3.cpp \
tools/imgui/imgui_impl_gtk3.h \
tools/imgui/imgui_impl_opengl3.cpp \
tools/imgui/imgui_impl_opengl3.h \
tools/imgui/stb_truetype.h \
tools/imgui/stb_rect_pack.h \
tools/imgui/LICENSE.txt \
tools/intel_sanitize_gpu.c \
tools/intel_sanitize_gpu.in \
tools/intel_dump_gpu.c \
......
......@@ -26,7 +26,7 @@ subdir('genxml')
subdir('isl')
subdir('common')
subdir('compiler')
if with_tools.contains('intel')
if with_tools.contains('intel') or with_tools.contains('intel-ui')
subdir('tools')
endif
if with_intel_vk
......
The MIT License (MIT)
Copyright (c) 2014-2018 Omar Cornut
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Dear ImGui
==========
This directory contains a copy of the Dear ImGui library at the following commit :
commit 6211f40f3d903dd9df961256e044029c49793aa3
Author: omar <omarcornut@gmail.com>
Date: Fri Jul 27 12:29:33 2018 +0200
Embedding the library into one's project is main way people seems to
work with ImGui. Since this is just for a debugging tool, we're not
exposing ourselves too much.
Apart from tweaking the GLEW include path, there is no other
modification to the files in this directory.
//-----------------------------------------------------------------------------
// COMPILE-TIME OPTIONS FOR DEAR IMGUI
// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure.
// You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions.
//-----------------------------------------------------------------------------
// A) You may edit imconfig.h (and not overwrite it when updating imgui, or maintain a patch/branch with your modifications to imconfig.h)
// B) or add configuration directives in your own file and compile with #define IMGUI_USER_CONFIG "myfilename.h"
// If you do so you need to make sure that configuration settings are defined consistently _everywhere_ dear imgui is used, which include
// the imgui*.cpp files but also _any_ of your code that uses imgui. This is because some compile-time options have an affect on data structures.
// Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts.
// Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using.
//-----------------------------------------------------------------------------
#pragma once
//---- Define assertion handler. Defaults to calling assert().
//#define IM_ASSERT(_EXPR) MyAssert(_EXPR)
//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts
//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows.
//#define IMGUI_API __declspec( dllexport )
//#define IMGUI_API __declspec( dllimport )
//---- Don't define obsolete functions/enums names. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names.
//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
//---- Don't implement demo windows functionality (ShowDemoWindow()/ShowStyleEditor()/ShowUserGuide() methods will be empty)
//---- It is very strongly recommended to NOT disable the demo windows during development. Please read the comments in imgui_demo.cpp.
//#define IMGUI_DISABLE_DEMO_WINDOWS
//---- Don't implement some functions to reduce linkage requirements.
//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc.
//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] Don't implement default IME handler. Won't use and link with ImmGetContext/ImmSetCompositionWindow.
//#define IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself if you don't want to link with vsnprintf.
//#define IMGUI_DISABLE_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 wrapper so you can implement them yourself. Declare your prototypes in imconfig.h.
//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions().
//---- Include imgui_user.h at the end of imgui.h as a convenience
//#define IMGUI_INCLUDE_IMGUI_USER_H
//---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another)
//#define IMGUI_USE_BGRA_PACKED_COLOR
//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version
// By default the embedded implementations are declared static and not available outside of imgui cpp files.
//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h"
//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h"
//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4.
// This will be inlined as part of ImVec2 and ImVec4 class declarations.
/*
#define IM_VEC2_CLASS_EXTRA \
ImVec2(const MyVec2& f) { x = f.x; y = f.y; } \
operator MyVec2() const { return MyVec2(x,y); }
#define IM_VEC4_CLASS_EXTRA \
ImVec4(const MyVec4& f) { x = f.x; y = f.y; z = f.z; w = f.w; } \
operator MyVec4() const { return MyVec4(x,y,z,w); }
*/
//---- Use 32-bit vertex indices (default is 16-bit) to allow meshes with more than 64K vertices. Render function needs to support it.
//#define ImDrawIdx unsigned int
//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files.
/*
namespace ImGui
{
void MyFunction(const char* name, const MyMatrix44& v);
}
*/
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
// ImGui GLFW binding with OpenGL3 + shaders
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
// https://github.com/ocornut/imgui
#include <stdio.h>
#include <imgui.h>
#include "imgui_impl_gtk3.h"
#include <gtk/gtk.h>
#define ARRAY_SIZE(arg) (sizeof(arg) / sizeof((arg)[0]))
#define EVENT_MASK \
((GdkEventMask) \
(GDK_STRUCTURE_MASK | \
GDK_FOCUS_CHANGE_MASK | \
GDK_EXPOSURE_MASK | \
GDK_PROPERTY_CHANGE_MASK | \
GDK_ENTER_NOTIFY_MASK | \
GDK_LEAVE_NOTIFY_MASK | \
GDK_KEY_PRESS_MASK | \
GDK_KEY_RELEASE_MASK | \
GDK_BUTTON_PRESS_MASK | \
GDK_BUTTON_RELEASE_MASK | \
GDK_POINTER_MOTION_MASK | \
GDK_SMOOTH_SCROLL_MASK | \
GDK_SCROLL_MASK))
// Data
static GtkWidget* g_GtkGlArea = NULL;
static guint64 g_Time = 0;
static bool g_MousePressed[5] = { false, false, false, false, false };
static ImVec2 g_MousePosition = ImVec2(-1, -1);
static float g_MouseWheel = 0.0f;
static int g_NumRedraws = 0;
static guint g_RedrawTimeout = 0;
static const char* ImGui_ImplGtk3_GetClipboardText(void* user_data)
{
static char *last_clipboard = NULL;
g_clear_pointer(&last_clipboard, g_free);
last_clipboard = gtk_clipboard_wait_for_text(GTK_CLIPBOARD(user_data));
return last_clipboard;
}
static void ImGui_ImplGtk3_SetClipboardText(void* user_data, const char* text)
{
gtk_clipboard_set_text(GTK_CLIPBOARD(user_data), text, -1);
}
void ImGui_ImplGtk3_HandleEvent(GdkEvent *event)
{
ImGuiIO& io = ImGui::GetIO();
GdkEventType type = gdk_event_get_event_type(event);
switch (type)
{
case GDK_MOTION_NOTIFY:
{
gdouble x = 0.0f, y = 0.0f;
if (gdk_event_get_coords(event, &x, &y))
g_MousePosition = ImVec2(x, y);
break;
}
case GDK_BUTTON_PRESS:
case GDK_BUTTON_RELEASE:
{
guint button = 0;
if (gdk_event_get_button(event, &button) && button > 0 && button <= 5)
{
if (type == GDK_BUTTON_PRESS)
g_MousePressed[button - 1] = true;
}
break;
}
case GDK_SCROLL:
{
gdouble x, y;
if (gdk_event_get_scroll_deltas(event, &x, &y))
g_MouseWheel = -y;
break;
}
case GDK_KEY_PRESS:
case GDK_KEY_RELEASE:
{
GdkEventKey *e = (GdkEventKey *) event;
static const struct
{
enum ImGuiKey_ imgui;
guint gdk;
} gdk_key_to_imgui_key[] =
{
{ ImGuiKey_Tab, GDK_KEY_Tab },
{ ImGuiKey_Tab, GDK_KEY_ISO_Left_Tab },
{ ImGuiKey_LeftArrow, GDK_KEY_Left },
{ ImGuiKey_RightArrow, GDK_KEY_Right },
{ ImGuiKey_UpArrow, GDK_KEY_Up },
{ ImGuiKey_DownArrow, GDK_KEY_Down },
{ ImGuiKey_PageUp, GDK_KEY_Page_Up },
{ ImGuiKey_PageDown, GDK_KEY_Page_Down },
{ ImGuiKey_Home, GDK_KEY_Home },
{ ImGuiKey_End, GDK_KEY_End },
{ ImGuiKey_Delete, GDK_KEY_Delete },
{ ImGuiKey_Backspace, GDK_KEY_BackSpace },
{ ImGuiKey_Enter, GDK_KEY_Return },
{ ImGuiKey_Escape, GDK_KEY_Escape },
{ ImGuiKey_A, GDK_KEY_a },
{ ImGuiKey_C, GDK_KEY_c },
{ ImGuiKey_V, GDK_KEY_v },
{ ImGuiKey_X, GDK_KEY_x },
{ ImGuiKey_Y, GDK_KEY_y },
{ ImGuiKey_Z, GDK_KEY_z },
};
for (unsigned i = 0; i < ARRAY_SIZE(gdk_key_to_imgui_key); i++)
{
if (e->keyval == gdk_key_to_imgui_key[i].gdk)
io.KeysDown[gdk_key_to_imgui_key[i].imgui] = type == GDK_KEY_PRESS;
}
gunichar c = gdk_keyval_to_unicode(e->keyval);
if (g_unichar_isprint(c) && ImGuiKey_COUNT + c < ARRAY_SIZE(io.KeysDown))
io.KeysDown[ImGuiKey_COUNT + c] = type == GDK_KEY_PRESS;
if (type == GDK_KEY_PRESS && e->string)
io.AddInputCharactersUTF8(e->string);
struct {
bool *var;
GdkModifierType modifier;
guint keyvals[3];
} mods[] = {
{ &io.KeyCtrl, GDK_CONTROL_MASK,
{ GDK_KEY_Control_L, GDK_KEY_Control_R, 0 }, },
{ &io.KeyShift, GDK_SHIFT_MASK,
{ GDK_KEY_Shift_L, GDK_KEY_Shift_R, 0 }, },
{ &io.KeyAlt, GDK_MOD1_MASK,
{ GDK_KEY_Alt_L, GDK_KEY_Alt_R, 0 }, },
{ &io.KeySuper, GDK_SUPER_MASK,
{ GDK_KEY_Super_L, GDK_KEY_Super_R, 0 }, }
};
for (unsigned i = 0; i < ARRAY_SIZE(mods); i++)
{
*mods[i].var = (mods[i].modifier & e->state);
bool match = false;
for (int j = 0; mods[i].keyvals[j] != 0; j++)
if (e->keyval == mods[i].keyvals[j])
match = true;
if (match)
*mods[i].var = type == GDK_KEY_PRESS;
}
break;
}
default:
break;
}
// We trigger 2 subsequent redraws for each event because of the
// way some ImGui widgets work. For example a Popup menu will only
// appear a frame after a click happened.
g_NumRedraws = 2;
gtk_widget_queue_draw(g_GtkGlArea);
}
static gboolean handle_gdk_event(GtkWidget *widget, GdkEvent *event, void *data)
{
ImGui_ImplGtk3_HandleEvent(event);
return TRUE;
}
bool ImGui_ImplGtk3_Init(GtkWidget* gl_area, bool install_callbacks)
{
g_clear_pointer(&g_GtkGlArea, g_object_unref);
g_GtkGlArea = GTK_WIDGET(g_object_ref(gl_area));
gtk_widget_realize(g_GtkGlArea);
gtk_widget_set_can_focus(g_GtkGlArea, TRUE);
gtk_widget_grab_focus(g_GtkGlArea);
if (install_callbacks) {
gtk_widget_add_events(g_GtkGlArea, EVENT_MASK);
g_signal_connect(g_GtkGlArea, "event", G_CALLBACK(handle_gdk_event), NULL);
}
ImGuiIO& io = ImGui::GetIO();
for (int i = 0; i < ImGuiKey_COUNT; i++)
{
io.KeyMap[i] = i;
}
io.SetClipboardTextFn = ImGui_ImplGtk3_SetClipboardText;
io.GetClipboardTextFn = ImGui_ImplGtk3_GetClipboardText;
io.ClipboardUserData = gtk_widget_get_clipboard(g_GtkGlArea,
GDK_SELECTION_CLIPBOARD);
return true;
}
void ImGui_ImplGtk3_Shutdown()
{
g_clear_pointer(&g_GtkGlArea, g_object_unref);
if (g_RedrawTimeout)
g_source_remove(g_RedrawTimeout);
}
static gboolean timeout_callback(gpointer data)
{
gtk_widget_queue_draw(g_GtkGlArea);
g_RedrawTimeout = 0;
return FALSE;
}
static void kick_timeout_redraw(float timeout)
{
if (g_RedrawTimeout)
return;
g_RedrawTimeout = g_timeout_add(timeout * 1000, timeout_callback, NULL);
}
void ImGui_ImplGtk3_NewFrame()
{
bool next_redraw = false;
if (g_NumRedraws > 0)
{
gtk_widget_queue_draw(g_GtkGlArea);
g_NumRedraws--;
next_redraw = true;
}
ImGuiIO& io = ImGui::GetIO();
// Setup display size (every frame to accommodate for window resizing)
io.DisplaySize = ImVec2((float)gtk_widget_get_allocated_width(g_GtkGlArea),
(float)gtk_widget_get_allocated_height(g_GtkGlArea));
int scale_factor = gtk_widget_get_scale_factor(g_GtkGlArea);
io.DisplayFramebufferScale = ImVec2(scale_factor, scale_factor);
// Setup time step
guint64 current_time = g_get_monotonic_time();
io.DeltaTime = g_Time > 0 ? ((float)(current_time - g_Time) / 1000000) : (float)(1.0f/60.0f);
g_Time = current_time;
// Setup inputs
if (gtk_widget_has_focus(g_GtkGlArea))
{
io.MousePos = g_MousePosition; // Mouse position in screen coordinates (set to -1,-1 if no mouse / on another screen, etc.)
}
else
{
io.MousePos = ImVec2(-1,-1);
}
GdkWindow *window = gtk_widget_get_window(g_GtkGlArea);
GdkDevice *pointer = gdk_device_manager_get_client_pointer(gdk_display_get_device_manager(gdk_display_get_default()));
GdkModifierType modifiers;
gdk_device_get_state(pointer, window, NULL, &modifiers);
for (int i = 0; i < 3; i++)
{
io.MouseDown[i] = g_MousePressed[i] || (modifiers & (GDK_BUTTON1_MASK << i)) != 0;
g_MousePressed[i] = false;
}
io.MouseWheel = g_MouseWheel;
g_MouseWheel = 0.0f;
// Hide OS mouse cursor if ImGui is drawing it
GdkDisplay *display = gdk_window_get_display(window);
GdkCursor *cursor =
gdk_cursor_new_from_name(display, io.MouseDrawCursor ? "none" : "default");
gdk_window_set_cursor(window, cursor);
g_object_unref(cursor);
if (!next_redraw && io.WantTextInput)
kick_timeout_redraw(0.2);
}
// ImGui Gtk3 binding with Cogl
// In this binding, ImTextureID is used to store an OpenGL 'GLuint' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.
// https://github.com/ocornut/imgui
#include <gtk/gtk.h>
IMGUI_API bool ImGui_ImplGtk3_Init(GtkWidget* gl_area, bool install_callbacks);
IMGUI_API void ImGui_ImplGtk3_HandleEvent(GdkEvent *event);
IMGUI_API void ImGui_ImplGtk3_Shutdown();
IMGUI_API void ImGui_ImplGtk3_NewFrame();
This diff is collapsed.
// ImGui Renderer for: OpenGL3 (modern OpenGL with shaders / programmatic pipeline)
// This needs to be used along with a Platform Binding (e.g. GLFW, SDL, Win32, custom..)
// (Note: We are using GL3W as a helper library to access OpenGL functions since there is no standard header to access modern OpenGL functions easily. Alternatives are GLEW, Glad, etc..)
// Implemented features:
// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID in imgui.cpp.
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
// If you are new to dear imgui, read examples/README.txt and read the documentation at the top of imgui.cpp.
// https://github.com/ocornut/imgui
// About GLSL version:
// The 'glsl_version' initialization parameter defaults to "#version 130" if NULL.
// Only override if your GL version doesn't handle this GLSL version (see table at the top of imgui_impl_opengl3.cpp). Keep NULL if unsure!
IMGUI_IMPL_API bool ImGui_ImplOpenGL3_Init(const char* glsl_version = NULL);
IMGUI_IMPL_API void ImGui_ImplOpenGL3_Shutdown();
IMGUI_IMPL_API void ImGui_ImplOpenGL3_NewFrame();
IMGUI_IMPL_API void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data);
// Called by Init/NewFrame/Shutdown
IMGUI_IMPL_API bool ImGui_ImplOpenGL3_CreateFontsTexture();
IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyFontsTexture();
IMGUI_IMPL_API bool ImGui_ImplOpenGL3_CreateDeviceObjects();
IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects();
This diff is collapsed.
libintel_imgui_core = static_library(
'intel_imgui_core',
files('imgui.cpp', 'imgui_demo.cpp', 'imgui_draw.cpp'),
install: false
)
libintel_imgui_gtk_deps = [
dependency('epoxy'),
dependency('gtk+-3.0'),
]
libintel_imgui_gtk = static_library(
'intel_imgui_gtk',
files('imgui_impl_gtk3.cpp', 'imgui_impl_opengl3.cpp'),
dependencies : libintel_imgui_gtk_deps,
cpp_args : ['-Wno-deprecated-declarations', '-Wno-parentheses'],
install: false
)
libintel_imgui_gtk_dep = declare_dependency(
link_with: [libintel_imgui_core, libintel_imgui_gtk],
dependencies: libintel_imgui_gtk_deps,
include_directories: include_directories('.')
)
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -18,7 +18,6 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
libaub = static_library(
'aub',
files('aub_read.c', 'aub_mem.c'),
......@@ -106,3 +105,7 @@ libintel_dump_gpu = shared_library(
install_dir: get_option('libexecdir'),
install: true
)
if with_tools.contains('intel-ui')
subdir('imgui')
endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment