mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-04 06:06:17 +00:00
c/direct_mode: Don't cache enumerated modes in a std:map.
This commit is contained in:
parent
015d9457fe
commit
16d6500923
|
@ -61,7 +61,6 @@ struct comp_window_direct
|
||||||
Display *dpy = nullptr;
|
Display *dpy = nullptr;
|
||||||
xcb_screen_t *screen = nullptr;
|
xcb_screen_t *screen = nullptr;
|
||||||
|
|
||||||
std::map<uint32_t, xcb_randr_mode_info_t> randr_modes = {};
|
|
||||||
std::vector<comp_window_direct_randr_display> randr_displays = {};
|
std::vector<comp_window_direct_randr_display> randr_displays = {};
|
||||||
|
|
||||||
std::vector<comp_window_direct_nvidia_display> nv_displays = {};
|
std::vector<comp_window_direct_nvidia_display> nv_displays = {};
|
||||||
|
@ -126,11 +125,6 @@ static VkDisplayKHR
|
||||||
comp_window_direct_get_xlib_randr_output(struct comp_window_direct *w,
|
comp_window_direct_get_xlib_randr_output(struct comp_window_direct *w,
|
||||||
RROutput output);
|
RROutput output);
|
||||||
|
|
||||||
static void
|
|
||||||
comp_window_direct_enumerate_randr_modes(
|
|
||||||
struct comp_window_direct *w,
|
|
||||||
xcb_randr_get_screen_resources_reply_t *resources_reply);
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
comp_window_direct_get_randr_outputs(struct comp_window_direct *w);
|
comp_window_direct_get_randr_outputs(struct comp_window_direct *w);
|
||||||
|
|
||||||
|
@ -161,7 +155,6 @@ comp_window_direct_create(struct comp_compositor *c)
|
||||||
w->base.init_swapchain = comp_window_direct_init_swapchain;
|
w->base.init_swapchain = comp_window_direct_init_swapchain;
|
||||||
w->base.update_window_title = comp_window_direct_update_window_title;
|
w->base.update_window_title = comp_window_direct_update_window_title;
|
||||||
w->base.c = c;
|
w->base.c = c;
|
||||||
w->randr_modes.clear();
|
|
||||||
|
|
||||||
return &w->base;
|
return &w->base;
|
||||||
}
|
}
|
||||||
|
@ -719,24 +712,10 @@ comp_window_direct_get_xlib_randr_output(struct comp_window_direct *w,
|
||||||
return display;
|
return display;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
comp_window_direct_enumerate_randr_modes(
|
|
||||||
struct comp_window_direct *w,
|
|
||||||
xcb_randr_get_screen_resources_reply_t *resources_reply)
|
|
||||||
{
|
|
||||||
xcb_randr_mode_info_t *mode_infos =
|
|
||||||
xcb_randr_get_screen_resources_modes(resources_reply);
|
|
||||||
|
|
||||||
int n = xcb_randr_get_screen_resources_modes_length(resources_reply);
|
|
||||||
for (int i = 0; i < n; i++)
|
|
||||||
w->randr_modes.insert(
|
|
||||||
std::pair<uint32_t, xcb_randr_mode_info_t>(mode_infos[i].id,
|
|
||||||
mode_infos[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
append_randr_display(struct comp_window_direct *w,
|
append_randr_display(struct comp_window_direct *w,
|
||||||
xcb_randr_get_output_info_reply_t *output_reply,
|
xcb_randr_get_output_info_reply_t *output_reply,
|
||||||
|
xcb_randr_get_screen_resources_reply_t *resources_reply,
|
||||||
xcb_randr_output_t xcb_output)
|
xcb_randr_output_t xcb_output)
|
||||||
{
|
{
|
||||||
xcb_randr_mode_t *output_modes =
|
xcb_randr_mode_t *output_modes =
|
||||||
|
@ -754,10 +733,19 @@ append_randr_display(struct comp_window_direct *w,
|
||||||
name);
|
name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (w->randr_modes.count(output_modes[0]) == 0) {
|
xcb_randr_mode_info_t *mode_infos =
|
||||||
|
xcb_randr_get_screen_resources_modes(resources_reply);
|
||||||
|
|
||||||
|
int n = xcb_randr_get_screen_resources_modes_length(resources_reply);
|
||||||
|
|
||||||
|
xcb_randr_mode_info_t *mode_info = NULL;
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
if (mode_infos[i].id == output_modes[0])
|
||||||
|
mode_info = &mode_infos[i];
|
||||||
|
|
||||||
|
if (mode_info == NULL)
|
||||||
COMP_ERROR(w->base.c, "No mode with id %d found??",
|
COMP_ERROR(w->base.c, "No mode with id %d found??",
|
||||||
output_modes[0]);
|
output_modes[0]);
|
||||||
}
|
|
||||||
|
|
||||||
char *name_str = U_TYPED_ARRAY_CALLOC(char, name_len + 1);
|
char *name_str = U_TYPED_ARRAY_CALLOC(char, name_len + 1);
|
||||||
memcpy(name_str, name, name_len);
|
memcpy(name_str, name, name_len);
|
||||||
|
@ -766,7 +754,7 @@ append_randr_display(struct comp_window_direct *w,
|
||||||
comp_window_direct_randr_display d = {
|
comp_window_direct_randr_display d = {
|
||||||
.name = std::string(name_str),
|
.name = std::string(name_str),
|
||||||
.output = xcb_output,
|
.output = xcb_output,
|
||||||
.primary_mode = w->randr_modes.at(output_modes[0]),
|
.primary_mode = *mode_info,
|
||||||
.display = VK_NULL_HANDLE,
|
.display = VK_NULL_HANDLE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -830,8 +818,6 @@ comp_window_direct_get_randr_outputs(struct comp_window_direct *w)
|
||||||
xcb_randr_output_t *xcb_outputs =
|
xcb_randr_output_t *xcb_outputs =
|
||||||
xcb_randr_get_screen_resources_outputs(resources_reply);
|
xcb_randr_get_screen_resources_outputs(resources_reply);
|
||||||
|
|
||||||
comp_window_direct_enumerate_randr_modes(w, resources_reply);
|
|
||||||
|
|
||||||
int count =
|
int count =
|
||||||
xcb_randr_get_screen_resources_outputs_length(resources_reply);
|
xcb_randr_get_screen_resources_outputs_length(resources_reply);
|
||||||
if (count < 1) {
|
if (count < 1) {
|
||||||
|
@ -886,7 +872,8 @@ comp_window_direct_get_randr_outputs(struct comp_window_direct *w)
|
||||||
uint8_t non_desktop =
|
uint8_t non_desktop =
|
||||||
*xcb_randr_get_output_property_data(prop_reply);
|
*xcb_randr_get_output_property_data(prop_reply);
|
||||||
if (non_desktop == 1)
|
if (non_desktop == 1)
|
||||||
append_randr_display(w, output_reply, xcb_outputs[i]);
|
append_randr_display(w, output_reply, resources_reply,
|
||||||
|
xcb_outputs[i]);
|
||||||
|
|
||||||
free(prop_reply);
|
free(prop_reply);
|
||||||
free(output_reply);
|
free(output_reply);
|
||||||
|
|
Loading…
Reference in a new issue