intel: add some format helpers
diff --git a/icd/intel/format.c b/icd/intel/format.c
index 41d9aae..0a704c4 100644
--- a/icd/intel/format.c
+++ b/icd/intel/format.c
@@ -395,7 +395,7 @@
GEN6_FORMAT_BC7_UNORM_SRGB, },
};
-static int intel_format_translate_color(XGL_FORMAT format)
+int intel_format_translate_color(XGL_FORMAT format)
{
int fmt;
diff --git a/icd/intel/format.h b/icd/intel/format.h
index c3399b6..a4c949f 100644
--- a/icd/intel/format.h
+++ b/icd/intel/format.h
@@ -27,6 +27,21 @@
#include "intel.h"
+static inline bool intel_format_is_depth(XGL_FORMAT format)
+{
+ return (format.numericFormat == XGL_NUM_FMT_DS &&
+ (format.channelFormat == XGL_CH_FMT_R16 ||
+ format.channelFormat == XGL_CH_FMT_R32));
+}
+
+static inline bool intel_format_is_stencil(XGL_FORMAT format)
+{
+ return (format.numericFormat == XGL_NUM_FMT_DS &&
+ format.channelFormat == XGL_CH_FMT_R8);
+}
+
+int intel_format_translate_color(XGL_FORMAT format);
+
XGL_RESULT XGLAPI intelGetFormatInfo(
XGL_DEVICE device,
XGL_FORMAT format,
diff --git a/icd/intel/intel.h b/icd/intel/intel.h
index 5c70a2f..125c6f9 100644
--- a/icd/intel/intel.h
+++ b/icd/intel/intel.h
@@ -34,6 +34,7 @@
#include <xglDbg.h>
#include "icd.h"
+#include "icd-format.h"
#include "icd-utils.h"
#define INTEL_API_VERSION XGL_MAKE_VERSION(0, 22, 0)
diff --git a/icd/intel/layout.c b/icd/intel/layout.c
index 71a0de9..337b282 100644
--- a/icd/intel/layout.c
+++ b/icd/intel/layout.c
@@ -26,6 +26,7 @@
*/
#include "dev.h"
+#include "format.h"
#include "gpu.h"
#include "layout.h"
@@ -581,8 +582,7 @@
*
* GEN6 does not support compact spacing otherwise.
*/
- layout->full_layers = !(layout->format.channelFormat == XGL_CH_FMT_R8 &&
- layout->format.numericFormat == XGL_NUM_FMT_DS);
+ layout->full_layers = !intel_format_is_stencil(layout->format);
}
static void
@@ -634,88 +634,11 @@
}
layout->format = format;
+ layout->block_width = icd_format_get_block_width(format);
+ layout->block_height = layout->block_width;
+ layout->block_size = icd_format_get_size(format);
- layout->block_width = 1;
- layout->block_height = 1;
- layout->block_size = 1;
- params->compressed = false;
-
- switch (format.channelFormat) {
- case XGL_CH_FMT_UNDEFINED:
- break;
- case XGL_CH_FMT_R4G4:
- layout->block_size = 1;
- break;
- case XGL_CH_FMT_R4G4B4A4:
- layout->block_size = 2;
- break;
- case XGL_CH_FMT_R5G6B5:
- case XGL_CH_FMT_B5G6R5:
- case XGL_CH_FMT_R5G5B5A1:
- layout->block_size = 2;
- break;
- case XGL_CH_FMT_R8:
- layout->block_size = 1;
- break;
- case XGL_CH_FMT_R8G8:
- layout->block_size = 2;
- break;
- case XGL_CH_FMT_R8G8B8A8:
- case XGL_CH_FMT_B8G8R8A8:
- case XGL_CH_FMT_R10G11B11:
- case XGL_CH_FMT_R11G11B10:
- case XGL_CH_FMT_R10G10B10A2:
- layout->block_size = 4;
- break;
- case XGL_CH_FMT_R16:
- layout->block_size = 2;
- break;
- case XGL_CH_FMT_R16G16:
- layout->block_size = 4;
- break;
- case XGL_CH_FMT_R16G16B16A16:
- layout->block_size = 8;
- break;
- case XGL_CH_FMT_R32:
- layout->block_size = 4;
- break;
- case XGL_CH_FMT_R32G32:
- layout->block_size = 8;
- break;
- case XGL_CH_FMT_R32G32B32:
- layout->block_size = 12;
- break;
- case XGL_CH_FMT_R32G32B32A32:
- layout->block_size = 16;
- break;
- case XGL_CH_FMT_R16G8:
- layout->block_size = 3;
- break;
- case XGL_CH_FMT_R32G8:
- layout->block_size = 5;
- break;
- case XGL_CH_FMT_R9G9B9E5:
- layout->block_size = 4;
- break;
- case XGL_CH_FMT_BC1:
- case XGL_CH_FMT_BC2:
- case XGL_CH_FMT_BC3:
- case XGL_CH_FMT_BC4:
- case XGL_CH_FMT_BC5:
- case XGL_CH_FMT_BC6U:
- case XGL_CH_FMT_BC6S:
- case XGL_CH_FMT_BC7:
- layout->block_width = 4;
- layout->block_height = 4;
- layout->block_size =
- (format.channelFormat == XGL_CH_FMT_BC1 ||
- format.channelFormat == XGL_CH_FMT_BC4) ? 8 : 16;
- params->compressed = true;
- break;
- default:
- assert(!"unknown format");
- break;
- }
+ params->compressed = icd_format_is_compressed(format);
}
static bool
@@ -789,7 +712,7 @@
if (!(info->usage & XGL_IMAGE_USAGE_DEPTH_STENCIL_BIT))
return false;
- if (info->format.channelFormat == XGL_CH_FMT_R8)
+ if (!intel_format_is_depth(info->format))
return false;
if (intel_gpu_gen(params->gpu) >= INTEL_GEN(7)) {
@@ -951,8 +874,7 @@
align_h = 32;
break;
default:
- if (layout->format.channelFormat == XGL_CH_FMT_R8 &&
- layout->format.numericFormat == XGL_NUM_FMT_DS) {
+ if (intel_format_is_stencil(layout->format)) {
/*
* From the Sandy Bridge PRM, volume 1 part 2, page 22:
*