Commit 1b8b7b53 authored by Tom Anderson's avatar Tom Anderson Committed by Commit Bot

Detect 30bpp screens on Linux/X11

BUG=1021659
R=sky

Change-Id: Iec957bd6f0f1d182d7e467df188f9de7ea4fe0ab
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1899565
Commit-Queue: Thomas Anderson <thomasanderson@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#712874}
parent 6f4b4271
...@@ -6,6 +6,9 @@ ...@@ -6,6 +6,9 @@
#include <dlfcn.h> #include <dlfcn.h>
#include <bitset>
#include "base/bits.h"
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/logging.h" #include "base/logging.h"
#include "ui/base/x/x11_util.h" #include "ui/base/x/x11_util.h"
...@@ -113,6 +116,39 @@ float GetRefreshRateFromXRRModeInfo(XRRModeInfo* modes, ...@@ -113,6 +116,39 @@ float GetRefreshRateFromXRRModeInfo(XRRModeInfo* modes,
return 0; return 0;
} }
int DefaultScreenDepth(XDisplay* xdisplay) {
return DefaultDepth(xdisplay, DefaultScreen(xdisplay));
}
int DefaultBitsPerComponent(XDisplay* xdisplay) {
Visual* visual = DefaultVisual(xdisplay, DefaultScreen(xdisplay));
// The mask fields are only valid for DirectColor and TrueColor classes.
if (visual->c_class == DirectColor || visual->c_class == TrueColor) {
// RGB components are packed into fixed size integers for each visual. The
// layout of bits in the packing is given by
// |visual->{red,green,blue}_mask|. Count the number of bits to get the
// number of bits per component.
auto bits = [](auto mask) {
return std::bitset<sizeof(mask) * 8>{mask}.count();
};
size_t red_bits = bits(visual->red_mask);
size_t green_bits = bits(visual->green_mask);
size_t blue_bits = bits(visual->blue_mask);
if (red_bits == green_bits && red_bits == blue_bits)
return red_bits;
}
// Next, try getting the number of colormap entries per subfield. If it's a
// power of 2, log2 is a possible guess for the number of bits per component.
if (base::bits::IsPowerOfTwo(visual->map_entries))
return base::bits::Log2Ceiling(visual->map_entries);
// |bits_per_rgb| can sometimes be unreliable (may be 11 for 30bpp visuals),
// so only use it as a last resort.
return visual->bits_per_rgb;
}
} // namespace } // namespace
int GetXrandrVersion(XDisplay* xdisplay) { int GetXrandrVersion(XDisplay* xdisplay) {
...@@ -147,6 +183,9 @@ std::vector<display::Display> GetFallbackDisplayList(float scale) { ...@@ -147,6 +183,9 @@ std::vector<display::Display> GetFallbackDisplayList(float scale) {
scale = 1; scale = 1;
} }
gfx_display.set_color_depth(DefaultScreenDepth(display));
gfx_display.set_depth_per_component(DefaultBitsPerComponent(display));
std::vector<display::Display> displays{gfx_display}; std::vector<display::Display> displays{gfx_display};
ClipWorkArea(&displays, 0, scale); ClipWorkArea(&displays, 0, scale);
return displays; return displays;
...@@ -170,6 +209,9 @@ std::vector<display::Display> BuildDisplaysFromXRandRInfo( ...@@ -170,6 +209,9 @@ std::vector<display::Display> BuildDisplaysFromXRandRInfo(
return GetFallbackDisplayList(scale); return GetFallbackDisplayList(scale);
} }
const int depth = DefaultScreenDepth(xdisplay);
const int bits_per_component = DefaultBitsPerComponent(xdisplay);
std::map<RROutput, int> output_to_monitor = std::map<RROutput, int> output_to_monitor =
GetMonitors(version, xdisplay, x_root_window); GetMonitors(version, xdisplay, x_root_window);
*primary_display_index_out = 0; *primary_display_index_out = 0;
...@@ -247,6 +289,9 @@ std::vector<display::Display> BuildDisplaysFromXRandRInfo( ...@@ -247,6 +289,9 @@ std::vector<display::Display> BuildDisplaysFromXRandRInfo(
display.set_color_space(icc_profile.GetPrimariesOnlyColorSpace()); display.set_color_space(icc_profile.GetPrimariesOnlyColorSpace());
} }
display.set_color_depth(depth);
display.set_depth_per_component(bits_per_component);
// Set monitor refresh rate // Set monitor refresh rate
int refresh_rate = static_cast<int>(GetRefreshRateFromXRRModeInfo( int refresh_rate = static_cast<int>(GetRefreshRateFromXRRModeInfo(
resources->modes, resources->nmode, crtc->mode)); resources->modes, resources->nmode, crtc->mode));
......
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