[Mesa-dev] [PATCH 11/13] gallium: Add buffer and configs handling or fp16 formats
Kevin Strasser
kevin.strasser at intel.com
Mon Jan 28 18:42:54 UTC 2019
Expose configs when allow_fp16_configs has been enabled and
DRI_LOADER_CAP_FP16 is set in the loader.
Also, make kms_swrast_dri respect format bpp, to allow for allocating
buffers wider than 32 bpp.
Signed-off-by: Kevin Strasser <kevin.strasser at intel.com>
---
src/gallium/state_trackers/dri/dri2.c | 22 ++++++++++++++++++
src/gallium/state_trackers/dri/dri_drawable.c | 3 +++
src/gallium/state_trackers/dri/dri_screen.c | 27 ++++++++++++++++++++++-
src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c | 2 +-
src/mesa/state_tracker/st_cb_fbo.c | 3 +++
5 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
index ebbbabb..396e0cb 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -74,6 +74,10 @@ struct dri2_format_mapping {
};
static const struct dri2_format_mapping dri2_format_table[] = {
+ { __DRI_IMAGE_FOURCC_ABGR16161616F, __DRI_IMAGE_FORMAT_ABGR16161616F,
+ __DRI_IMAGE_COMPONENTS_RGBA, PIPE_FORMAT_R16G16B16A16_FLOAT },
+ { __DRI_IMAGE_FOURCC_XBGR16161616F, __DRI_IMAGE_FORMAT_XBGR16161616F,
+ __DRI_IMAGE_COMPONENTS_RGB, PIPE_FORMAT_R16G16B16X16_FLOAT },
{ __DRI_IMAGE_FOURCC_ARGB2101010, __DRI_IMAGE_FORMAT_ARGB2101010,
__DRI_IMAGE_COMPONENTS_RGBA, PIPE_FORMAT_B10G10R10A2_UNORM },
{ __DRI_IMAGE_FOURCC_XRGB2101010, __DRI_IMAGE_FORMAT_XRGB2101010,
@@ -222,6 +226,12 @@ dri2_drawable_get_buffers(struct dri_drawable *drawable,
* may occur as the stvis->color_format.
*/
switch(format) {
+ case PIPE_FORMAT_R16G16B16A16_FLOAT:
+ depth = 64;
+ break;
+ case PIPE_FORMAT_R16G16B16X16_FLOAT:
+ depth = 48;
+ break;
case PIPE_FORMAT_B10G10R10A2_UNORM:
case PIPE_FORMAT_R10G10B10A2_UNORM:
case PIPE_FORMAT_BGRA8888_UNORM:
@@ -300,6 +310,12 @@ dri_image_drawable_get_buffers(struct dri_drawable *drawable,
}
switch (pf) {
+ case PIPE_FORMAT_R16G16B16A16_FLOAT:
+ image_format = __DRI_IMAGE_FORMAT_ABGR16161616F;
+ break;
+ case PIPE_FORMAT_R16G16B16X16_FLOAT:
+ image_format = __DRI_IMAGE_FORMAT_XBGR16161616F;
+ break;
case PIPE_FORMAT_B5G5R5A1_UNORM:
image_format = __DRI_IMAGE_FORMAT_ARGB1555;
break;
@@ -373,6 +389,12 @@ dri2_allocate_buffer(__DRIscreen *sPriv,
bind |= PIPE_BIND_SHARED;
switch (format) {
+ case 64:
+ pf = PIPE_FORMAT_R16G16B16A16_FLOAT;
+ break;
+ case 48:
+ pf = PIPE_FORMAT_R16G16B16X16_FLOAT;
+ break;
case 32:
pf = PIPE_FORMAT_BGRA8888_UNORM;
break;
diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c
index e5a7537..9584367 100644
--- a/src/gallium/state_trackers/dri/dri_drawable.c
+++ b/src/gallium/state_trackers/dri/dri_drawable.c
@@ -260,6 +260,9 @@ dri_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
if (format == __DRI_TEXTURE_FORMAT_RGB) {
/* only need to cover the formats recognized by dri_fill_st_visual */
switch (internal_format) {
+ case PIPE_FORMAT_R16G16B16A16_FLOAT:
+ internal_format = PIPE_FORMAT_R16G16B16X16_FLOAT;
+ break;
case PIPE_FORMAT_B10G10R10A2_UNORM:
internal_format = PIPE_FORMAT_B10G10R10X2_UNORM;
break;
diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c
index 82a0988..0eb12c2 100644
--- a/src/gallium/state_trackers/dri/dri_screen.c
+++ b/src/gallium/state_trackers/dri/dri_screen.c
@@ -142,6 +142,10 @@ dri_fill_in_modes(struct dri_screen *screen)
/* Required by Android, for HAL_PIXEL_FORMAT_RGBX_8888. */
MESA_FORMAT_R8G8B8X8_UNORM,
+
+ /* Required by Android, for HAL_PIXEL_FORMAT_RGBA_FP16. */
+ MESA_FORMAT_RGBA_FLOAT16,
+ MESA_FORMAT_RGBX_FLOAT16,
};
static const enum pipe_format pipe_formats[] = {
PIPE_FORMAT_B10G10R10A2_UNORM,
@@ -155,6 +159,8 @@ dri_fill_in_modes(struct dri_screen *screen)
PIPE_FORMAT_B5G6R5_UNORM,
PIPE_FORMAT_RGBA8888_UNORM,
PIPE_FORMAT_RGBX8888_UNORM,
+ PIPE_FORMAT_R16G16B16A16_FLOAT,
+ PIPE_FORMAT_R16G16B16X16_FLOAT,
};
mesa_format format;
__DRIconfig **configs = NULL;
@@ -167,6 +173,7 @@ dri_fill_in_modes(struct dri_screen *screen)
boolean pf_z16, pf_x8z24, pf_z24x8, pf_s8z24, pf_z24s8, pf_z32;
boolean mixed_color_depth;
boolean allow_rgb10;
+ boolean allow_fp16;
static const GLenum back_buffer_modes[] = {
__DRI_ATTRIB_SWAP_NONE, __DRI_ATTRIB_SWAP_UNDEFINED,
@@ -184,6 +191,8 @@ dri_fill_in_modes(struct dri_screen *screen)
}
allow_rgb10 = driQueryOptionb(&screen->dev->option_cache, "allow_rgb10_configs");
+ allow_fp16 = driQueryOptionb(&screen->dev->option_cache, "allow_fp16_configs");
+ allow_fp16 &= dri_loader_get_cap(screen, DRI_LOADER_CAP_FP16);
msaa_samples_max = (screen->st_api->feature_mask & ST_API_FEATURE_MS_VISUALS_MASK)
? MSAA_VISUAL_MAX_SAMPLES : 1;
@@ -236,7 +245,7 @@ dri_fill_in_modes(struct dri_screen *screen)
if (dri_loader_get_cap(screen, DRI_LOADER_CAP_RGBA_ORDERING))
num_formats = ARRAY_SIZE(mesa_formats);
else
- num_formats = ARRAY_SIZE(mesa_formats) - 2; /* all - RGBA_ORDERING formats */
+ num_formats = ARRAY_SIZE(mesa_formats) - 4; /* all - RGBA_ORDERING formats */
/* Add configs. */
for (format = 0; format < num_formats; format++) {
@@ -251,6 +260,11 @@ dri_fill_in_modes(struct dri_screen *screen)
mesa_formats[format] == MESA_FORMAT_R10G10B10X2_UNORM))
continue;
+ if (!allow_fp16 &&
+ (mesa_formats[format] == MESA_FORMAT_RGBA_FLOAT16 ||
+ mesa_formats[format] == MESA_FORMAT_RGBX_FLOAT16))
+ continue;
+
if (!p_screen->is_format_supported(p_screen, pipe_formats[format],
PIPE_TEXTURE_2D, 0, 0,
PIPE_BIND_RENDER_TARGET |
@@ -315,6 +329,17 @@ dri_fill_st_visual(struct st_visual *stvis,
/* Deduce the color format. */
switch (mode->redMask) {
+ case 0:
+ /* Formats > 32 bpp */
+ assert(mode->floatMode);
+ if (mode->alphaShift > -1) {
+ assert(mode->alphaShift == 48);
+ stvis->color_format = PIPE_FORMAT_R16G16B16A16_FLOAT;
+ } else {
+ stvis->color_format = PIPE_FORMAT_R16G16B16X16_FLOAT;
+ }
+ break;
+
case 0x3FF00000:
if (mode->alphaMask) {
assert(mode->alphaMask == 0xC0000000);
diff --git a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
index 9564d94..e921a61 100644
--- a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
+++ b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
@@ -182,7 +182,7 @@ kms_sw_displaytarget_create(struct sw_winsys *ws,
kms_sw_dt->format = format;
memset(&create_req, 0, sizeof(create_req));
- create_req.bpp = 32;
+ create_req.bpp = util_format_get_blocksizebits(format);
create_req.width = width;
create_req.height = height;
ret = drmIoctl(kms_sw->fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_req);
diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
index 8d099f7..85bd270 100644
--- a/src/mesa/state_tracker/st_cb_fbo.c
+++ b/src/mesa/state_tracker/st_cb_fbo.c
@@ -417,6 +417,9 @@ st_new_renderbuffer_fb(enum pipe_format format, unsigned samples, boolean sw)
case PIPE_FORMAT_R16G16B16A16_FLOAT:
strb->Base.InternalFormat = GL_RGBA16F;
break;
+ case PIPE_FORMAT_R16G16B16X16_FLOAT:
+ strb->Base.InternalFormat = GL_RGB16F;
+ break;
default:
_mesa_problem(NULL,
"Unexpected format %s in st_new_renderbuffer_fb",
--
2.7.4
More information about the mesa-dev
mailing list