Populate __DRI_ATTRIB_FLOAT_BIT, such that we can filter for formats containing floating point pixel data and egl/glx can satisfy the requirements for their respective extensions.
Signed-off-by: Kevin Strasser <[email protected]> --- src/egl/drivers/dri2/egl_dri2.c | 2 ++ src/egl/drivers/dri2/platform_drm.c | 18 +++++++++++++++--- src/gbm/backends/dri/gbm_dri.c | 12 ++++++++++++ src/gbm/backends/dri/gbm_driint.h | 1 + src/mesa/drivers/dri/common/utils.c | 5 +++++ 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index d19950d..fb8f1b7 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -202,6 +202,8 @@ dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id, &value); ++i) { switch (attrib) { case __DRI_ATTRIB_RENDER_TYPE: + if (value & __DRI_ATTRIB_FLOAT_BIT) + _eglSetConfigKey(&base, EGL_COLOR_COMPONENT_TYPE_EXT, EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT); if (value & __DRI_ATTRIB_RGBA_BIT) value = EGL_RGB_BUFFER; else if (value & __DRI_ATTRIB_LUMINANCE_BIT) diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index 47563d6..ae235e9 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -98,6 +98,7 @@ dri2_drm_config_is_compatible(struct dri2_egl_display *dri2_dpy, const struct gbm_dri_visual *visual = NULL; unsigned long long int red, green, blue, alpha; unsigned int mask_hi = 0, mask_lo, render_type; + bool is_float; int i; /* Check that the EGLConfig being used to render to the surface is @@ -129,6 +130,10 @@ dri2_drm_config_is_compatible(struct dri2_egl_display *dri2_dpy, &mask_lo); alpha = (unsigned long long int)mask_hi << 32 | mask_lo; + dri2_dpy->core->getConfigAttrib(config, __DRI_ATTRIB_RENDER_TYPE, + &render_type); + is_float = (render_type & __DRI_ATTRIB_FLOAT_BIT) ? true : false; + for (i = 0; i < dri2_dpy->gbm_dri->num_visuals; i++) { visual = &dri2_dpy->gbm_dri->visual_table[i]; if (visual->gbm_format == surface->format) @@ -141,7 +146,8 @@ dri2_drm_config_is_compatible(struct dri2_egl_display *dri2_dpy, if (red != visual->rgba_masks.red || green != visual->rgba_masks.green || blue != visual->rgba_masks.blue || - (alpha && visual->rgba_masks.alpha && alpha != visual->rgba_masks.alpha)) { + (alpha && visual->rgba_masks.alpha && alpha != visual->rgba_masks.alpha) || + is_float != visual->is_float) { return false; } @@ -649,7 +655,8 @@ drm_add_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *disp) for (unsigned i = 0; dri2_dpy->driver_configs[i]; i++) { const __DRIconfig *config = dri2_dpy->driver_configs[i]; unsigned long long int red, green, blue, alpha; - unsigned int mask_hi = 0, mask_lo; + unsigned int mask_hi = 0, mask_lo, render_type; + bool is_float; dri2_dpy->core->getConfigAttrib(config, __DRI_ATTRIB_RED_MASK_HI, &mask_hi); @@ -675,13 +682,18 @@ drm_add_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *disp) &mask_lo); alpha = (unsigned long long int)mask_hi << 32 | mask_lo; + dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i], + __DRI_ATTRIB_RENDER_TYPE, &render_type); + is_float = (render_type & __DRI_ATTRIB_FLOAT_BIT) ? true : false; + for (unsigned j = 0; j < num_visuals; j++) { struct dri2_egl_config *dri2_conf; if (visuals[j].rgba_masks.red != red || visuals[j].rgba_masks.green != green || visuals[j].rgba_masks.blue != blue || - visuals[j].rgba_masks.alpha != alpha) + visuals[j].rgba_masks.alpha != alpha || + visuals[j].is_float != is_float) continue; const EGLint attr_list[] = { diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index abbb0b9..225b0de 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -487,50 +487,62 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = { { GBM_FORMAT_R8, __DRI_IMAGE_FORMAT_R8, { 0x000000ff, 0x00000000, 0x00000000, 0x00000000 }, + false, }, { GBM_FORMAT_GR88, __DRI_IMAGE_FORMAT_GR88, { 0x000000ff, 0x0000ff00, 0x00000000, 0x00000000 }, + false, }, { GBM_FORMAT_ARGB1555, __DRI_IMAGE_FORMAT_ARGB1555, { 0x00007c00, 0x000003e0, 0x0000001f, 0x00008000 }, + false, }, { GBM_FORMAT_RGB565, __DRI_IMAGE_FORMAT_RGB565, { 0x0000f800, 0x000007e0, 0x0000001f, 0x00000000 }, + false, }, { GBM_FORMAT_XRGB8888, __DRI_IMAGE_FORMAT_XRGB8888, { 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 }, + false, }, { GBM_FORMAT_ARGB8888, __DRI_IMAGE_FORMAT_ARGB8888, { 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }, + false, }, { GBM_FORMAT_XBGR8888, __DRI_IMAGE_FORMAT_XBGR8888, { 0x000000ff, 0x0000ff00, 0x00ff0000, 0x00000000 }, + false, }, { GBM_FORMAT_ABGR8888, __DRI_IMAGE_FORMAT_ABGR8888, { 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }, + false, }, { GBM_FORMAT_XRGB2101010, __DRI_IMAGE_FORMAT_XRGB2101010, { 0x3ff00000, 0x000ffc00, 0x000003ff, 0x00000000 }, + false, }, { GBM_FORMAT_ARGB2101010, __DRI_IMAGE_FORMAT_ARGB2101010, { 0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000 }, + false, }, { GBM_FORMAT_XBGR2101010, __DRI_IMAGE_FORMAT_XBGR2101010, { 0x000003ff, 0x000ffc00, 0x3ff00000, 0x00000000 }, + false, }, { GBM_FORMAT_ABGR2101010, __DRI_IMAGE_FORMAT_ABGR2101010, { 0x000003ff, 0x000ffc00, 0x3ff00000, 0xc0000000 }, + false, }, }; diff --git a/src/gbm/backends/dri/gbm_driint.h b/src/gbm/backends/dri/gbm_driint.h index 0640198..acf53bd 100644 --- a/src/gbm/backends/dri/gbm_driint.h +++ b/src/gbm/backends/dri/gbm_driint.h @@ -49,6 +49,7 @@ struct gbm_dri_visual { uint64_t blue; uint64_t alpha; } rgba_masks; + bool is_float; }; struct gbm_dri_device { diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c index c7e5b84..b52c59f 100644 --- a/src/mesa/drivers/dri/common/utils.c +++ b/src/mesa/drivers/dri/common/utils.c @@ -213,6 +213,7 @@ driCreateConfigs(mesa_format format, int blue_bits; int alpha_bits; bool is_srgb; + bool is_float; switch (format) { case MESA_FORMAT_B5G6R5_UNORM: @@ -257,6 +258,7 @@ driCreateConfigs(mesa_format format, blue_bits = _mesa_get_format_bits(format, GL_BLUE_BITS); alpha_bits = _mesa_get_format_bits(format, GL_ALPHA_BITS); is_srgb = _mesa_get_format_color_encoding(format) == GL_SRGB; + is_float = _mesa_get_format_datatype(format) == GL_FLOAT; num_modes = num_depth_stencil_bits * num_db_modes * num_accum_bits * num_msaa_modes; configs = calloc(num_modes + 1, sizeof *configs); @@ -286,6 +288,7 @@ driCreateConfigs(mesa_format format, c++; memset(modes, 0, sizeof *modes); + modes->floatMode = is_float; modes->redBits = red_bits; modes->greenBits = green_bits; modes->blueBits = blue_bits; @@ -455,6 +458,8 @@ driGetConfigAttribIndex(const __DRIconfig *config, case __DRI_ATTRIB_RENDER_TYPE: /* no support for color index mode */ *value = __DRI_ATTRIB_RGBA_BIT; + if (config->modes.floatMode) + *value |= __DRI_ATTRIB_FLOAT_BIT; break; case __DRI_ATTRIB_CONFIG_CAVEAT: if (config->modes.visualRating == GLX_NON_CONFORMANT_CONFIG) -- 2.7.4 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
