aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/compute/skc/platforms/cl_12/raster_builder_cl_12.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/compute/skc/platforms/cl_12/raster_builder_cl_12.h')
-rw-r--r--src/compute/skc/platforms/cl_12/raster_builder_cl_12.h165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/compute/skc/platforms/cl_12/raster_builder_cl_12.h b/src/compute/skc/platforms/cl_12/raster_builder_cl_12.h
new file mode 100644
index 0000000000..f6e1751ef1
--- /dev/null
+++ b/src/compute/skc/platforms/cl_12/raster_builder_cl_12.h
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can
+ * be found in the LICENSE file.
+ *
+ */
+
+#ifndef SKC_RASTER_BUILDER_CL_12_ONCE
+#define SKC_RASTER_BUILDER_CL_12_ONCE
+
+//
+//
+//
+
+#include "types.h"
+#include "macros.h"
+#include "common.h"
+
+//
+// FIXME -- these magic numbers will be replaced with tile.h constants
+// although they're probably universal across all devices
+//
+// FIXME -- NEED TO EVALUATE IF THIS DISTRIBUTION OF BITS IS GOING TO
+// BE TOO SMALL -- plenty of room to jiggle these bits
+//
+
+#define SKC_CMD_RASTERIZE_BITS_TRANSFORM 12
+#define SKC_CMD_RASTERIZE_BITS_CLIP 12
+#define SKC_CMD_RASTERIZE_BITS_COHORT 8
+
+SKC_STATIC_ASSERT(SKC_CMD_RASTERIZE_BITS_TRANSFORM == SKC_CMD_FILL_BITS_TRANSFORM);
+SKC_STATIC_ASSERT(SKC_CMD_RASTERIZE_BITS_CLIP == SKC_CMD_FILL_BITS_CLIP);
+SKC_STATIC_ASSERT(SKC_CMD_RASTERIZE_BITS_COHORT == SKC_CMD_FILL_BITS_COHORT);
+
+//
+// device-side rasterization cmd
+//
+
+union skc_cmd_rasterize
+{
+ skc_ulong u64;
+
+ skc_uint2 u32v2;
+
+ struct {
+ //
+ // Unlike anywhere else in the pipeline, the nodeword index points
+ // "inside" of a path node (with word resolution). This means
+ // there is up to 16 GB of 32-bit word addressing in a unified
+ // block pool:
+ //
+ // "16GB ought to be enough for anyone" -- ASM 5/30/17
+ //
+ skc_uint nodeword;
+#if defined(__OPENCL_C_VERSION__)
+ skc_uint tcc;
+#else
+ skc_uint transform : SKC_CMD_RASTERIZE_BITS_TRANSFORM;
+ skc_uint clip : SKC_CMD_RASTERIZE_BITS_CLIP;
+ skc_uint cohort : SKC_CMD_RASTERIZE_BITS_COHORT;
+#endif
+ };
+};
+
+SKC_STATIC_ASSERT(sizeof(union skc_cmd_rasterize) == sizeof(skc_uint2));
+
+//
+//
+//
+
+#define SKC_CMD_RASTERIZE_HI_OFFSET_COHORT (SKC_CMD_RASTERIZE_BITS_TRANSFORM + SKC_CMD_RASTERIZE_BITS_CLIP)
+#define SKC_CMD_RASTERIZE_MASK_COHORT(c) ((c).u32v2.hi & SKC_BITS_TO_MASK_AT(SKC_CMD_RASTERIZE_BITS_COHORT,SKC_CMD_RASTERIZE_HI_OFFSET_COHORT))
+
+#define SKC_CMD_RASTERIZE_GET_TRANSFORM(c) ((c).u32v2.hi & SKC_BITS_TO_MASK(SKC_CMD_RASTERIZE_BITS_TRANSFORM))
+#define SKC_CMD_RASTERIZE_GET_CLIP(c) SKC_BFE((c).tcc,SKC_CMD_RASTERIZE_BITS_CLIP,SKC_CMD_RASTERIZE_BITS_TRANSFORM)
+#define SKC_CMD_RASTERIZE_GET_COHORT(c) ((c).u32v2.hi >> SKC_CMD_RASTERIZE_HI_OFFSET_COHORT)
+// SKC_BFE((c).tcc,SKC_CMD_RASTERIZE_BITS_COHORT,SKC_CMD_RASTERIZE_HI_OFFSET_COHORT)
+
+//
+//
+//
+
+#define SKC_TTSK_SIZE_COHORT (1 << SKC_CMD_RASTERIZE_BITS_COHORT)
+
+//
+// COHORT META DATA
+//
+
+union skc_raster_cohort_meta_in
+{
+ skc_uint4 u32v4;
+
+ struct {
+ skc_uint blocks; // # of rk blocks
+ skc_uint offset; // start of rk span
+ skc_uint pk; // # of pk keys
+ skc_uint rk; // # of rk keys
+ };
+};
+
+union skc_raster_cohort_meta_out
+{
+ skc_uint4 u32v4;
+
+ struct {
+ skc_uint blocks; // # of blocks in raster -- initially just rk blocks
+ skc_uint offset; // start of rk span
+ skc_uint nodes; // # of nodes in raster -- necessary for walking
+ skc_uint keys; // # of rk & pk keys -- initially just rk
+ };
+};
+
+union skc_raster_cohort_meta_inout
+{
+ union skc_raster_cohort_meta_in in;
+ union skc_raster_cohort_meta_out out;
+};
+
+//
+// followed by one word for the offset
+//
+
+struct skc_raster_cohort_meta
+{
+ union skc_raster_cohort_meta_inout inout[SKC_TTSK_SIZE_COHORT];
+ skc_uint reads[SKC_TTSK_SIZE_COHORT]; // starting ring reads -- [0] is raster head
+};
+
+#define SKC_RASTER_COHORT_META_OFFSET_READS (SKC_OFFSET_OF(struct skc_raster_cohort_meta,reads) / sizeof(skc_uint))
+
+//
+// COHORT ATOMICS
+//
+
+struct skc_raster_cohort_atomic
+{
+ // rasterization input
+ skc_uint cmds;
+
+ // rasterization output
+ skc_uint keys;
+
+ // block pool base -- idea here is to perform one atomic allocation
+ // skc_uint bp_base;
+};
+
+#define SKC_RASTER_COHORT_ATOMIC_OFFSET_CMDS 0
+#define SKC_RASTER_COHORT_ATOMIC_OFFSET_KEYS 1
+
+#define SKC_RASTER_COHORT_ATOMIC_OFFSET_CMDS_CALC (SKC_OFFSET_OF(struct skc_raster_cohort_atomic,cmds) / sizeof(skc_uint))
+#define SKC_RASTER_COHORT_ATOMIC_OFFSET_KEYS_CALC (SKC_OFFSET_OF(struct skc_raster_cohort_atomic,keys) / sizeof(skc_uint))
+
+SKC_STATIC_ASSERT(SKC_RASTER_COHORT_ATOMIC_OFFSET_CMDS == SKC_RASTER_COHORT_ATOMIC_OFFSET_CMDS_CALC); // verify
+SKC_STATIC_ASSERT(SKC_RASTER_COHORT_ATOMIC_OFFSET_KEYS == SKC_RASTER_COHORT_ATOMIC_OFFSET_KEYS_CALC); // verify
+
+//
+//
+//
+
+#endif
+
+//
+//
+//