iris: some program code
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 16 Jan 2018 09:15:15 +0000 (01:15 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:04 +0000 (10:26 -0800)
src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_draw.c
src/gallium/drivers/iris/iris_program.c
src/gallium/drivers/iris/iris_state.c
src/gallium/drivers/iris/meson.build

index 5adafed600cbf8da77a939eba840daafc73d1c83..7ecdfb058ceb73e70c3b52f78360fc73a939d2ab 100644 (file)
@@ -58,6 +58,12 @@ enum iris_dirty {
    IRIS_DIRTY_SAMPLER_STATES_GS        = (1ull << 19),
    IRIS_DIRTY_SAMPLER_STATES_PS        = (1ull << 20),
    IRIS_DIRTY_SAMPLER_STATES_CS        = (1ull << 21),
+   IRIS_DIRTY_UNCOMPILED_VS            = (1ull << 22),
+   IRIS_DIRTY_UNCOMPILED_TCS           = (1ull << 23),
+   IRIS_DIRTY_UNCOMPILED_TES           = (1ull << 24),
+   IRIS_DIRTY_UNCOMPILED_GS            = (1ull << 25),
+   IRIS_DIRTY_UNCOMPILED_FS            = (1ull << 26),
+   IRIS_DIRTY_UNCOMPILED_CS            = (1ull << 27),
 };
 
 struct iris_depth_stencil_alpha_state;
@@ -67,6 +73,8 @@ struct iris_context {
 
    struct pipe_debug_callback dbg;
 
+   struct iris_uncompiled_shader *progs[MESA_SHADER_STAGES];
+
    struct {
       uint64_t dirty;
       unsigned num_viewports; // XXX: can viewports + scissors be different?
@@ -106,7 +114,11 @@ void iris_init_state_functions(struct pipe_context *ctx);
 
 void iris_upload_render_state(struct iris_context *ice,
                               struct iris_batch *batch,
-                              struct pipe_draw_info *draw);
+                              const struct pipe_draw_info *draw);
 void iris_destroy_state(struct iris_context *ice);
 
+void iris_update_compiled_shaders(struct iris_context *ice);
+
+void iris_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info);
+
 #endif
index 58b0187500ec928a0200e9bcb9ef826a0f5d5688..afeb149c95b2c9c21c85b7e04779c5a6b5810de7 100644 (file)
 #include "intel/compiler/brw_compiler.h"
 #include "iris_context.h"
 
-#define __gen_address_type unsigned
-#define __gen_user_data void
-
-static uint64_t
-__gen_combine_address(void *user_data, void *location,
-                      unsigned address, uint32_t delta)
-{
-   return delta;
-}
-
-#define __genxml_cmd_length(cmd) cmd ## _length
-#define __genxml_cmd_length_bias(cmd) cmd ## _length_bias
-#define __genxml_cmd_header(cmd) cmd ## _header
-#define __genxml_cmd_pack(cmd) cmd ## _pack
-
-#define iris_pack_command(cmd, dst, name)                         \
-   for (struct cmd name = { __genxml_cmd_header(cmd) },           \
-        *_dst = (void *)(dst); __builtin_expect(_dst != NULL, 1); \
-        __genxml_cmd_pack(cmd)(NULL, (void *)dst, &name),         \
-        _dst = NULL)
-
-#define iris_pack_state(cmd, dst, name)                           \
-   for (struct cmd name = {},                                     \
-        *_dst = (void *)(dst); __builtin_expect(_dst != NULL, 1); \
-        __genxml_cmd_pack(cmd)(NULL, (void *)_dst, &name),        \
-        _dst = NULL)
-
-#include "genxml/genX_pack.h"
-#include "genxml/gen_macros.h"
-
-static void
+void
 iris_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
 {
    struct iris_context *ice = (struct iris_context *) ctx;
 
-   iris_upload_render_state(ice, draw);
-
-#if 0
-   l3 configuration
-
-   3DSTATE_VIEWPORT_STATE_POINTERS_CC - CC_VIEWPORT
-     -> from iris_depth_stencil_alpha_state
-
-   3DSTATE_VIEWPORT_STATE_POINTERS_SF_CL - SF_CLIP_VIEWPORT
-     -> pipe_viewport_state for matrix elements, guardband is calculated
-        from those.  can calculate screen space from matrix apparently...
-
-   3DSTATE_SCISSOR_STATE_POINTERS - SCISSOR_RECT
-     -> from ice->state.scissors
-
-   3DSTATE_PUSH_CONSTANT_ALLOC_*
-   3DSTATE_URB_*
-     -> TODO
-
-   3DSTATE_PS_BLEND
-   3DSTATE_BLEND_STATE_POINTERS - BLEND_STATE
-     -> from iris_blend_state (most) + iris_depth_stencil_alpha_state
-        (alpha test function/enable) + has writeable RT from ???????
-
-   3DSTATE_CC_STATE_POINTERS - COLOR_CALC_STATE
-     -> from ice->state.blend_color + iris_depth_stencil_alpha_state
-        (ref_value)
-
-   3DSTATE_CONSTANT_* - push constants
-     -> TODO
-
-   Surfaces:
-   - pull constants
-   - ubos/ssbos/abos
-   - images
-   - textures
-   - render targets - write and read
-   3DSTATE_BINDING_TABLE_POINTERS_*
-     -> TODO
-
-   3DSTATE_SAMPLER_STATE_POINTERS_*
-     -> TODO
-
-   3DSTATE_MULTISAMPLE
-   3DSTATE_SAMPLE_MASK
-
-   3DSTATE_VS
-   3DSTATE_HS
-   3DSTATE_TE
-   3DSTATE_DS
-   3DSTATE_GS
-   3DSTATE_PS_EXTRA
-   3DSTATE_PS
-   3DSTATE_STREAMOUT
-   3DSTATE_SO_BUFFER
-   3DSTATE_SO_DECL_LIST
-
-   3DSTATE_CLIP
-     -> iris_raster_state + ??? (Non-perspective Bary, ForceZeroRTAIndex)
-
-   3DSTATE_RASTER
-   3DSTATE_SF
-     -> iris_raster_state
-
-   3DSTATE_WM
-     -> iris_raster_state + FS state (barycentric, EDSC)
-   3DSTATE_SBE
-     -> iris_raster_state (point sprite texture coordinate origin)
-     -> bunch of shader state...
-   3DSTATE_SBE_SWIZ
-     -> FS state
-
-   3DSTATE_DEPTH_BUFFER
-   3DSTATE_HIER_DEPTH_BUFFER
-   3DSTATE_STENCIL_BUFFER
-   3DSTATE_CLEAR_PARAMS
-     -> iris_framebuffer_state?
-
-   3DSTATE_VF_TOPOLOGY
-     -> pipe_draw_info (prim_mode)
-   3DSTATE_VF
-     -> pipe_draw_info (restart_index, primitive_restart)
-
-   3DSTATE_INDEX_BUFFER
-     -> pipe_draw_info (index)
-   3DSTATE_VERTEX_BUFFERS
-     -> pipe_vertex_buffer (set_vertex_buffer hook)
-   3DSTATE_VERTEX_ELEMENTS
-     -> iris_vertex_element
-   3DSTATE_VF_INSTANCING
-     -> iris_vertex_element
-   3DSTATE_VF_SGVS
-     -> TODO ???
-   3DSTATE_VF_COMPONENT_PACKING
-     -> TODO ???
-
-   3DPRIMITIVE
-     -> pipe_draw_info
-
-   rare:
-   3DSTATE_POLY_STIPPLE_OFFSET
-   3DSTATE_POLY_STIPPLE_PATTERN
-     -> ice->state.poly_stipple
-   3DSTATE_LINE_STIPPLE
-     -> iris_raster_state
-
-   once:
-   3DSTATE_AA_LINE_PARAMETERS
-   3DSTATE_WM_CHROMAKEY
-   3DSTATE_SAMPLE_PATTERN
-   3DSTATE_DRAWING_RECTANGLE
-   3DSTATE_WM_HZ_OP
-#endif
+   iris_update_compiled_shaders(ice);
+   //iris_upload_render_state(ice, &ice->batch, info);
+   iris_upload_render_state(ice, NULL, info);
 }
index 9d7c19b0323c5fc3b1059ebbc6273a3576db2bf6..9d4716579ece2c04628d602c247f0f998cbf9d42 100644 (file)
@@ -44,6 +44,8 @@ struct iris_uncompiled_shader {
    unsigned program_id;
 };
 
+// XXX: need unify_interfaces() at link time...
+
 static void *
 iris_create_shader_state(struct pipe_context *ctx,
                          const struct pipe_shader_state *state)
@@ -55,41 +57,228 @@ iris_create_shader_state(struct pipe_context *ctx,
 
    nir_shader *nir = state->ir.nir;
 
-   struct iris_uncompiled_shader *cso =
+   struct iris_uncompiled_shader *ish =
       calloc(1, sizeof(struct iris_uncompiled_shader));
-   if (!cso)
+   if (!ish)
       return NULL;
 
    nir = brw_preprocess_nir(screen->compiler, nir);
+   //NIR_PASS_V(nir, brw_nir_lower_uniforms, true);
 
-   cso->program_id = get_new_program_id(screen);
-   cso->base.type = PIPE_SHADER_IR_NIR;
-   cso->base.ir.nir = nir;
+   ish->program_id = get_new_program_id(screen);
+   ish->base.type = PIPE_SHADER_IR_NIR;
+   ish->base.ir.nir = nir;
 
-   return cso;
+   return ish;
 }
 
 static void
 iris_delete_shader_state(struct pipe_context *ctx, void *hwcso)
 {
-   struct iris_uncompiled_shader *cso = hwcso;
+   struct iris_uncompiled_shader *ish = hwcso;
+
+   ralloc_free(ish->base.ir.nir);
+   free(ish);
+}
+
+static void
+iris_bind_vs_state(struct pipe_context *ctx, void *hwcso)
+{
+   struct iris_context *ice = (struct iris_context *)ctx;
+
+   ice->progs[MESA_SHADER_VERTEX] = hwcso;
+   ice->state.dirty |= IRIS_DIRTY_UNCOMPILED_VS;
+}
+
+static void
+iris_bind_tcs_state(struct pipe_context *ctx, void *hwcso)
+{
+   struct iris_context *ice = (struct iris_context *)ctx;
+
+   ice->progs[MESA_SHADER_TESS_CTRL] = hwcso;
+   ice->state.dirty |= IRIS_DIRTY_UNCOMPILED_TCS;
+}
+
+static void
+iris_bind_tes_state(struct pipe_context *ctx, void *hwcso)
+{
+   struct iris_context *ice = (struct iris_context *)ctx;
+
+   ice->progs[MESA_SHADER_TESS_EVAL] = hwcso;
+   ice->state.dirty |= IRIS_DIRTY_UNCOMPILED_TES;
+}
+
+static void
+iris_bind_gs_state(struct pipe_context *ctx, void *hwcso)
+{
+   struct iris_context *ice = (struct iris_context *)ctx;
+
+   ice->progs[MESA_SHADER_GEOMETRY] = hwcso;
+   ice->state.dirty |= IRIS_DIRTY_UNCOMPILED_GS;
+}
+
+static void
+iris_bind_fs_state(struct pipe_context *ctx, void *hwcso)
+{
+   struct iris_context *ice = (struct iris_context *)ctx;
+
+   ice->progs[MESA_SHADER_FRAGMENT] = hwcso;
+   ice->state.dirty |= IRIS_DIRTY_UNCOMPILED_FS;
+}
+
+/**
+ * Sets up the starting offsets for the groups of binding table entries
+ * common to all pipeline stages.
+ *
+ * Unused groups are initialized to 0xd0d0d0d0 to make it obvious that they're
+ * unused but also make sure that addition of small offsets to them will
+ * trigger some of our asserts that surface indices are < BRW_MAX_SURFACES.
+ */
+static uint32_t
+assign_common_binding_table_offsets(const struct gen_device_info *devinfo,
+                                    const struct shader_info *info,
+                                    struct brw_stage_prog_data *prog_data,
+                                    uint32_t next_binding_table_offset)
+{
+   prog_data->binding_table.texture_start = next_binding_table_offset;
+   prog_data->binding_table.gather_texture_start = next_binding_table_offset;
+   next_binding_table_offset += info->num_textures;
+
+   if (info->num_ubos) {
+      //assert(info->num_ubos <= BRW_MAX_UBO);
+      prog_data->binding_table.ubo_start = next_binding_table_offset;
+      next_binding_table_offset += info->num_ubos;
+   } else {
+      prog_data->binding_table.ubo_start = 0xd0d0d0d0;
+   }
+
+   if (info->num_ssbos || info->num_abos) {
+      //assert(info->num_abos <= BRW_MAX_ABO);
+      //assert(info->num_ssbos <= BRW_MAX_SSBO);
+      prog_data->binding_table.ssbo_start = next_binding_table_offset;
+      next_binding_table_offset += info->num_abos + info->num_ssbos;
+   } else {
+      prog_data->binding_table.ssbo_start = 0xd0d0d0d0;
+   }
+
+   prog_data->binding_table.shader_time_start = 0xd0d0d0d0;
+
+   if (info->num_images) {
+      prog_data->binding_table.image_start = next_binding_table_offset;
+      next_binding_table_offset += info->num_images;
+   } else {
+      prog_data->binding_table.image_start = 0xd0d0d0d0;
+   }
+
+   /* This may or may not be used depending on how the compile goes. */
+   prog_data->binding_table.pull_constants_start = next_binding_table_offset;
+   next_binding_table_offset++;
+
+   /* Plane 0 is just the regular texture section */
+   prog_data->binding_table.plane_start[0] = prog_data->binding_table.texture_start;
+
+   prog_data->binding_table.plane_start[1] = next_binding_table_offset;
+   next_binding_table_offset += info->num_textures;
+
+   prog_data->binding_table.plane_start[2] = next_binding_table_offset;
+   next_binding_table_offset += info->num_textures;
+
+   /* prog_data->base.binding_table.size will be set by brw_mark_surface_used. */
+
+   //assert(next_binding_table_offset <= BRW_MAX_SURFACES);
+   return next_binding_table_offset;
+}
+
+static bool
+iris_compile_vs(struct iris_context *ice,
+                struct iris_uncompiled_shader *ish,
+                const struct brw_vs_prog_key *key)
+{
+   struct iris_screen *screen = (struct iris_screen *)ice->ctx.screen;
+   const struct brw_compiler *compiler = screen->compiler;
+   const struct gen_device_info *devinfo = &screen->devinfo;
+   const unsigned *program;
+   struct brw_vs_prog_data prog_data;
+   struct brw_stage_prog_data *stage_prog_data = &prog_data.base.base;
+   void *mem_ctx = ralloc_context(NULL);
+
+   assert(ish->base.type == PIPE_SHADER_IR_NIR);
+
+   nir_shader *nir = ish->base.ir.nir;
+
+   memset(&prog_data, 0, sizeof(prog_data));
+
+   // XXX: alt mode
+   assign_common_binding_table_offsets(devinfo, &nir->info,
+                                       &prog_data.base.base, 0);
+   brw_compute_vue_map(devinfo,
+                       &prog_data.base.vue_map, nir->info.outputs_written,
+                       nir->info.separate_shader);
+
+   char *error_str;
+   program = brw_compile_vs(compiler, ice, mem_ctx, key, &prog_data,
+                            nir, -1, &error_str);
+   if (program == NULL) {
+      fprintf(stderr, "Failed to compile vertex shader: %s\n", error_str);
 
-   ralloc_free(cso->base.ir.nir);
-   free(cso);
+      ralloc_free(mem_ctx);
+      return false;
+   }
+
+   /* The param and pull_param arrays will be freed by the shader cache. */
+   ralloc_steal(NULL, prog_data.base.base.param);
+   ralloc_steal(NULL, prog_data.base.base.pull_param);
+   //brw_upload_cache(&brw->cache, BRW_CACHE_VS_PROG,
+                    //key, sizeof(struct brw_vs_prog_key),
+                    //program, prog_data.base.base.program_size,
+                    //&prog_data, sizeof(prog_data),
+                    //&brw->vs.base.prog_offset, &brw->vs.base.prog_data);
+   ralloc_free(mem_ctx);
+
+   return true;
+}
+
+static void
+iris_populate_vs_key(struct iris_context *ice, struct brw_vs_prog_key *key)
+{
+   memset(key, 0, sizeof(*key));
+}
+
+static void
+iris_update_compiled_vs(struct iris_context *ice)
+{
+   struct brw_vs_prog_key key;
+   iris_populate_vs_key(ice, &key);
+
+   UNUSED bool success =
+      iris_compile_vs(ice, ice->progs[MESA_SHADER_VERTEX], &key);
+}
+
+void
+iris_update_compiled_shaders(struct iris_context *ice)
+{
+   iris_update_compiled_vs(ice);
+   // ...
 }
 
 void
 iris_init_program_functions(struct pipe_context *ctx)
 {
-   ctx->create_vs_state = iris_create_shader_state;
+   ctx->create_vs_state  = iris_create_shader_state;
    ctx->create_tcs_state = iris_create_shader_state;
    ctx->create_tes_state = iris_create_shader_state;
-   ctx->create_gs_state = iris_create_shader_state;
-   ctx->create_fs_state = iris_create_shader_state;
+   ctx->create_gs_state  = iris_create_shader_state;
+   ctx->create_fs_state  = iris_create_shader_state;
 
-   ctx->delete_vs_state = iris_delete_shader_state;
+   ctx->delete_vs_state  = iris_delete_shader_state;
    ctx->delete_tcs_state = iris_delete_shader_state;
    ctx->delete_tes_state = iris_delete_shader_state;
-   ctx->delete_gs_state = iris_delete_shader_state;
-   ctx->delete_fs_state = iris_delete_shader_state;
+   ctx->delete_gs_state  = iris_delete_shader_state;
+   ctx->delete_fs_state  = iris_delete_shader_state;
+
+   ctx->bind_vs_state  = iris_bind_vs_state;
+   ctx->bind_tcs_state = iris_bind_tcs_state;
+   ctx->bind_tes_state = iris_bind_tes_state;
+   ctx->bind_gs_state  = iris_bind_gs_state;
+   ctx->bind_fs_state  = iris_bind_fs_state;
 }
index 3561d7e33133f1a8785d99fe6cf01c25300744fe..808b3e1b1f06a3f1d21848add0f85a7f79fad3ed 100644 (file)
@@ -281,11 +281,6 @@ iris_upload_initial_gpu_state(struct iris_context *ice,
    }
 }
 
-static void
-iris_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
-{
-}
-
 static void
 iris_launch_grid(struct pipe_context *ctx, const struct pipe_grid_info *info)
 {
@@ -1269,7 +1264,7 @@ iris_set_stream_output_targets(struct pipe_context *ctx,
 void
 iris_upload_render_state(struct iris_context *ice,
                          struct iris_batch *batch,
-                         struct pipe_draw_info *draw)
+                         const struct pipe_draw_info *draw)
 {
    const uint64_t dirty = ice->state.dirty;
 
@@ -1559,14 +1554,9 @@ iris_init_state_functions(struct pipe_context *ctx)
    ctx->bind_blend_state = iris_bind_blend_state;
    ctx->bind_depth_stencil_alpha_state = iris_bind_zsa_state;
    ctx->bind_sampler_states = iris_bind_sampler_states;
-   ctx->bind_fs_state = iris_bind_state;
    ctx->bind_rasterizer_state = iris_bind_rasterizer_state;
    ctx->bind_vertex_elements_state = iris_bind_vertex_elements_state;
    ctx->bind_compute_state = iris_bind_state;
-   ctx->bind_tcs_state = iris_bind_state;
-   ctx->bind_tes_state = iris_bind_state;
-   ctx->bind_gs_state = iris_bind_state;
-   ctx->bind_vs_state = iris_bind_state;
    ctx->delete_blend_state = iris_delete_state;
    ctx->delete_depth_stencil_alpha_state = iris_delete_state;
    ctx->delete_fs_state = iris_delete_state;
index 3c19a5bbdd35b6025f8f137694d2444a3f907616..4563edb42185343adaed6af0f78686f7f38f4df8 100644 (file)
@@ -24,6 +24,7 @@ files_libiris = files(
   'iris_bufmgr.c',
   'iris_bufmgr.h',
   'iris_context.h',
+  'iris_draw.c',
   'iris_formats.c',
   'iris_pipe.c',
   'iris_program.c',