diff options
author | Jason Ekstrand <[email protected]> | 2017-01-21 10:53:12 -0800 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-05-09 11:16:33 -0700 |
commit | 8ce31c9cc58489c2cc80a7ca62d14af4f386e8ef (patch) | |
tree | ecc71785dd9473bb81e24f02dc93dfe26597529a /src/intel | |
parent | 4e26e3dea9d11b2fe88d829488e1295161e68cbb (diff) |
intel/blorp: Support the RGB workaround on more formats
Previously we only supported UINT formats because that's what blorp_copy
required. If we want to use it in blorp_blit, however, we need to
support everything.
Reviewed-by: Topi Pohjolainen <[email protected]>
Diffstat (limited to 'src/intel')
-rw-r--r-- | src/intel/blorp/blorp_blit.c | 73 |
1 files changed, 53 insertions, 20 deletions
diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c index cd2d3b43157..a0e110fa1e4 100644 --- a/src/intel/blorp/blorp_blit.c +++ b/src/intel/blorp/blorp_blit.c @@ -1622,6 +1622,56 @@ struct blt_coords { struct blt_axis x, y; }; +static enum isl_format +get_red_format_for_rgb_format(enum isl_format format) +{ + const struct isl_format_layout *fmtl = isl_format_get_layout(format); + + switch (fmtl->channels.r.bits) { + case 8: + switch (fmtl->channels.r.type) { + case ISL_UNORM: + return ISL_FORMAT_R8_UNORM; + case ISL_SNORM: + return ISL_FORMAT_R8_SNORM; + case ISL_UINT: + return ISL_FORMAT_R8_UINT; + case ISL_SINT: + return ISL_FORMAT_R8_SINT; + default: + unreachable("Invalid 8-bit RGB channel type"); + } + case 16: + switch (fmtl->channels.r.type) { + case ISL_UNORM: + return ISL_FORMAT_R16_UNORM; + case ISL_SNORM: + return ISL_FORMAT_R16_SNORM; + case ISL_SFLOAT: + return ISL_FORMAT_R16_FLOAT; + case ISL_UINT: + return ISL_FORMAT_R16_UINT; + case ISL_SINT: + return ISL_FORMAT_R16_SINT; + default: + unreachable("Invalid 8-bit RGB channel type"); + } + case 32: + switch (fmtl->channels.r.type) { + case ISL_SFLOAT: + return ISL_FORMAT_R32_FLOAT; + case ISL_UINT: + return ISL_FORMAT_R32_UINT; + case ISL_SINT: + return ISL_FORMAT_R32_SINT; + default: + unreachable("Invalid 8-bit RGB channel type"); + } + default: + unreachable("Invalid number of red channel bits"); + } +} + static void surf_fake_rgb_with_red(const struct isl_device *isl_dev, struct brw_blorp_surface_info *info) @@ -1632,26 +1682,9 @@ surf_fake_rgb_with_red(const struct isl_device *isl_dev, info->surf.phys_level0_sa.width *= 3; info->tile_x_sa *= 3; - enum isl_format red_format; - switch (info->view.format) { - case ISL_FORMAT_R8G8B8_UNORM: - red_format = ISL_FORMAT_R8_UNORM; - break; - case ISL_FORMAT_R8G8B8_UINT: - red_format = ISL_FORMAT_R8_UINT; - break; - case ISL_FORMAT_R16G16B16_UNORM: - red_format = ISL_FORMAT_R16_UNORM; - break; - case ISL_FORMAT_R16G16B16_UINT: - red_format = ISL_FORMAT_R16_UINT; - break; - case ISL_FORMAT_R32G32B32_UINT: - red_format = ISL_FORMAT_R32_UINT; - break; - default: - unreachable("Invalid RGB copy destination format"); - } + enum isl_format red_format = + get_red_format_for_rgb_format(info->view.format); + assert(isl_format_get_layout(red_format)->channels.r.type == isl_format_get_layout(info->view.format)->channels.r.type); assert(isl_format_get_layout(red_format)->channels.r.bits == |