OSDN Git Service

v3d: Add pack header support for f187 values.
authorEric Anholt <eric@anholt.net>
Mon, 30 Jul 2018 18:41:15 +0000 (11:41 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 30 Jul 2018 21:29:01 +0000 (14:29 -0700)
V3D only has one of these (the top 16 bits of a float32) left in its CLs,
but VC4 had many more.  This gets us proper pretty-printing of the values
instead of a large uint.

src/broadcom/cle/gen_pack_header.py
src/broadcom/cle/v3d_decoder.c
src/broadcom/cle/v3d_decoder.h
src/broadcom/cle/v3d_packet_helpers.h
src/broadcom/cle/v3d_packet_v33.xml
src/gallium/drivers/v3d/v3dx_emit.c
src/gallium/drivers/v3d/v3dx_state.c

index 8ad5446..f79ee42 100644 (file)
@@ -152,6 +152,8 @@ class Field(object):
             type = 'bool'
         elif self.type == 'float':
             type = 'float'
+        elif self.type == 'f187':
+            type = 'float'
         elif self.type == 'ufixed':
             type = 'float'
         elif self.type == 'sfixed':
@@ -317,6 +319,9 @@ class Group(object):
                         (value, start, end)
                 elif field.type == "float":
                     s = "#error %s float value mixed in with other fields" % name
+                elif field.type == "f187":
+                    s = "__gen_uint(fui(%s) >> 16, %d, %d)" % \
+                        (value, start, end)
                 elif field.type == "offset":
                     s = "__gen_offset(%s, %d, %d)" % \
                         (value, start, end)
@@ -370,6 +375,8 @@ class Group(object):
                     convert = "__gen_unpack_uint"
                 elif field.type == "float":
                     convert = "__gen_unpack_float"
+                elif field.type == "f187":
+                    convert = "__gen_unpack_f187"
                 elif field.type == "offset":
                     convert = "__gen_unpack_offset"
                 elif field.type == 'ufixed':
index 7eb963f..22367ca 100644 (file)
@@ -316,6 +316,8 @@ string_to_type(struct parser_context *ctx, const char *s)
                 return (struct v3d_type) { .kind = V3D_TYPE_BOOL };
         else if (strcmp(s, "float") == 0)
                 return (struct v3d_type) { .kind = V3D_TYPE_FLOAT };
+        else if (strcmp(s, "f187") == 0)
+                return (struct v3d_type) { .kind = V3D_TYPE_F187 };
         else if (strcmp(s, "address") == 0)
                 return (struct v3d_type) { .kind = V3D_TYPE_ADDRESS };
         else if (strcmp(s, "offset") == 0)
@@ -887,6 +889,11 @@ v3d_field_iterator_next(struct clif_dump *clif, struct v3d_field_iterator *iter)
                          __gen_unpack_float(iter->p, s, e));
                 break;
 
+        case V3D_TYPE_F187:
+                snprintf(iter->value, sizeof(iter->value), "%f",
+                         __gen_unpack_f187(iter->p, s, e));
+                break;
+
         case V3D_TYPE_ADDRESS: {
                 uint32_t addr =
                         __gen_unpack_uint(iter->p, s, e) << (31 - (e - s));
index 10a7e50..b5ead38 100644 (file)
@@ -99,6 +99,7 @@ struct v3d_type {
                 V3D_TYPE_UINT,
                 V3D_TYPE_BOOL,
                 V3D_TYPE_FLOAT,
+                V3D_TYPE_F187,
                 V3D_TYPE_ADDRESS,
                 V3D_TYPE_OFFSET,
                 V3D_TYPE_STRUCT,
index 4720f64..f340b79 100644 (file)
@@ -26,6 +26,7 @@
 #include <stdbool.h>
 #include <assert.h>
 #include <math.h>
+#include <gallium/auxiliary/util/u_math.h>
 
 #ifdef HAVE_VALGRIND
 #include <valgrind.h>
@@ -205,3 +206,11 @@ __gen_unpack_float(const uint8_t *restrict cl, uint32_t start, uint32_t end)
    return f->f;
 }
 
+static inline float
+__gen_unpack_f187(const uint8_t *restrict cl, uint32_t start, uint32_t end)
+{
+   assert(end - start == 15);
+   uint32_t bits = __gen_unpack_uint(cl, start, end);
+   return uif(bits << 16);
+}
+
index 1f6d467..e4b7df0 100644 (file)
   </packet>
 
   <packet code="91" name="Sample State" min_ver="41">
-    <field name="Coverage" size="16" start="16" type="uint"/> <!-- float-1-8-7 -->
+    <field name="Coverage" size="16" start="16" type="f187"/>
     <field name="Mask" size="4" start="0" type="uint"/>
   </packet>
 
   </packet>
 
   <packet name="Depth Offset" code="106" max_ver="33">
-    <!-- these fields are both float-1-8-7 encoded (top 16 bits of a float32) -->
-    <field name="Depth Offset Units" size="16" start="16" type="uint"/>
-    <field name="Depth Offset Factor" size="16" start="0" type="uint"/>
+    <field name="Depth Offset Units" size="16" start="16" type="f187"/>
+    <field name="Depth Offset Factor" size="16" start="0" type="f187"/>
   </packet>
 
   <packet name="Depth Offset" code="106" min_ver="41">
     <field name="Limit" size="32" start="32" type="float"/>
-    <!-- these fields are both float-1-8-7 encoded (top 16 bits of a float32) -->
-    <field name="Depth Offset Units" size="16" start="16" type="uint"/>
-    <field name="Depth Offset Factor" size="16" start="0" type="uint"/>
+    <field name="Depth Offset Units" size="16" start="16" type="f187"/>
+    <field name="Depth Offset Factor" size="16" start="0" type="f187"/>
   </packet>
 
   <packet name="Clip Window" code="107">
index ee4849a..c371a53 100644 (file)
@@ -787,7 +787,7 @@ v3dX(emit_state)(struct pipe_context *pctx)
                         /* Note: SampleCoverage was handled at the
                          * state_tracker level by converting to sample_mask.
                          */
-                        state.coverage = fui(1.0) >> 16;
+                        state.coverage = 1.0;
                         state.mask = job->msaa ? v3d->sample_mask : 0xf;
                 }
         }
index 6ee4a2a..b7d6084 100644 (file)
@@ -81,12 +81,6 @@ v3d_set_sample_mask(struct pipe_context *pctx, unsigned sample_mask)
         v3d->dirty |= VC5_DIRTY_SAMPLE_STATE;
 }
 
-static uint16_t
-float_to_187_half(float f)
-{
-        return fui(f) >> 16;
-}
-
 static void *
 v3d_create_rasterizer_state(struct pipe_context *pctx,
                             const struct pipe_rasterizer_state *cso)
@@ -107,20 +101,16 @@ v3d_create_rasterizer_state(struct pipe_context *pctx,
         STATIC_ASSERT(sizeof(so->depth_offset) >=
                       cl_packet_length(DEPTH_OFFSET));
         v3dx_pack(&so->depth_offset, DEPTH_OFFSET, depth) {
-                depth.depth_offset_factor =
-                        float_to_187_half(cso->offset_scale);
-                depth.depth_offset_units =
-                        float_to_187_half(cso->offset_units);
+                depth.depth_offset_factor = cso->offset_scale;
+                depth.depth_offset_units = cso->offset_units;
         }
 
         /* The HW treats polygon offset units based on a Z24 buffer, so we
          * need to scale up offset_units if we're only Z16.
          */
         v3dx_pack(&so->depth_offset_z16, DEPTH_OFFSET, depth) {
-                depth.depth_offset_factor =
-                        float_to_187_half(cso->offset_scale);
-                depth.depth_offset_units =
-                        float_to_187_half(cso->offset_units * 256.0);
+                depth.depth_offset_factor = cso->offset_scale;
+                depth.depth_offset_units = cso->offset_units * 256.0;
         }
 
         return so;