intel: define meta ops
Meta ops include copy, clear, and resolve. We need a meta shader for each of
the meta ops, and the shaders should be created with intel_dev to avoid
recompilation and locking.
This commit creates only dummy meta shaders. They should be replaced by real
ones when the compiler or assembler is ready.
diff --git a/icd/intel/dev.h b/icd/intel/dev.h
index 419b267..cb42c06 100644
--- a/icd/intel/dev.h
+++ b/icd/intel/dev.h
@@ -32,9 +32,72 @@
#include "gpu.h"
#include "obj.h"
+struct intel_pipeline_shader;
struct intel_queue;
struct intel_winsys;
+enum intel_dev_meta_shader {
+ /*
+ * These expect an ivec4 to be pushed:
+ *
+ * .xy is added to fragment coord to form (u, v)
+ * .z is ai
+ * .w is lod
+ */
+ INTEL_DEV_META_FS_COPY_MEM, /* ld_lz(u) */
+ INTEL_DEV_META_FS_COPY_1D, /* ld(u, lod) */
+ INTEL_DEV_META_FS_COPY_1D_ARRAY, /* ld(u, lod, ai) */
+ INTEL_DEV_META_FS_COPY_2D, /* ld(u, lod, v) */
+ INTEL_DEV_META_FS_COPY_2D_ARRAY, /* ld(u, lod, v, ai) */
+ INTEL_DEV_META_FS_COPY_2D_MS, /* ld_mcs() + ld2dms() */
+
+ /*
+ * These expect a second ivec4 to be pushed:
+ *
+ * .x is memory offset
+ * .y is extent width
+ *
+ * The second ivec4 is to convert linear fragment coord to (u, v).
+ */
+ INTEL_DEV_META_FS_COPY_1D_TO_MEM, /* ld(u, lod) */
+ INTEL_DEV_META_FS_COPY_1D_ARRAY_TO_MEM, /* ld(u, lod, ai) */
+ INTEL_DEV_META_FS_COPY_2D_TO_MEM, /* ld(u, lod, v) */
+ INTEL_DEV_META_FS_COPY_2D_ARRAY_TO_MEM, /* ld(u, lod, v, ai) */
+ INTEL_DEV_META_FS_COPY_2D_MS_TO_MEM, /* ld_mcs() + ld2dms() */
+
+ /*
+ * This expects an ivec4 to be pushed:
+ *
+ * .xy is added to fargment coord to form (u, v)
+ * .z is extent width
+ *
+ * .z is used to linearize (u, v).
+ */
+ INTEL_DEV_META_FS_COPY_MEM_TO_IMG, /* ld_lz(u) */
+
+ /*
+ * These expect the clear value to be pushed, and set fragment color or
+ * depth to the clear value.
+ */
+ INTEL_DEV_META_FS_CLEAR_COLOR,
+ INTEL_DEV_META_FS_CLEAR_DEPTH,
+
+ /*
+ * These expect an ivec4 to be pushed:
+ *
+ * .xy is added to fragment coord to form (u, v)
+ *
+ * All samples are fetched and averaged. The fragment color is set to the
+ * averaged value.
+ */
+ INTEL_DEV_META_FS_RESOLVE_2X,
+ INTEL_DEV_META_FS_RESOLVE_4X,
+ INTEL_DEV_META_FS_RESOLVE_8X,
+ INTEL_DEV_META_FS_RESOLVE_16X,
+
+ INTEL_DEV_META_SHADER_COUNT,
+};
+
struct intel_dev_dbg_msg_filter {
XGL_INT msg_code;
XGL_DBG_MSG_FILTER filter;
@@ -61,7 +124,9 @@
struct intel_gpu *gpu;
struct intel_winsys *winsys;
+
struct intel_bo *cmd_scratch_bo;
+ struct intel_pipeline_shader *cmd_meta_shaders[INTEL_DEV_META_SHADER_COUNT];
struct intel_queue *queues[INTEL_GPU_ENGINE_COUNT];
};
@@ -99,6 +164,13 @@
XGL_INT msg_code,
const char *format, ...);
+static inline const struct intel_pipeline_shader *intel_dev_get_meta_shader(const struct intel_dev *dev,
+ enum intel_dev_meta_shader id)
+{
+ assert(id < INTEL_DEV_META_SHADER_COUNT);
+ return dev->cmd_meta_shaders[id];
+}
+
XGL_RESULT XGLAPI intelCreateDevice(
XGL_PHYSICAL_GPU gpu,
const XGL_DEVICE_CREATE_INFO* pCreateInfo,