summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/llvmpipe/lp_rast.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/llvmpipe/lp_rast.h')
-rw-r--r--src/gallium/drivers/llvmpipe/lp_rast.h129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_rast.h b/src/gallium/drivers/llvmpipe/lp_rast.h
new file mode 100644
index 0000000000..8f4bd52c9e
--- /dev/null
+++ b/src/gallium/drivers/llvmpipe/lp_rast.h
@@ -0,0 +1,129 @@
+
+#ifndef LP_RAST_H
+#define LP_RAST_H
+
+/* Initially create and program a single rasterizer directly. Later
+ * will want multiple of these, one or two per core. At that stage
+ * will probably pass command buffers into the rasterizers rather than
+ * individual function calls like this.
+ */
+struct lp_rasterizer;
+
+struct lp_rast_state {
+ /* State for the shader:
+ */
+ struct lp_jit_context jc;
+
+ /* The shader itself. Probably we also need to pass a pointer to
+ * the tile color/z/stencil data somehow:
+ */
+ void (*run)( struct lp_jit_context *jc,
+ struct quad_header **quads,
+ unsigned nr );
+};
+
+/* Coefficients necessary to run the shader at a given location:
+ */
+struct lp_rast_shader_inputs {
+
+ /* Current rasterizer state:
+ */
+ const struct lp_rast_state *state;
+
+ /* Attribute interpolation:
+ */
+ struct tgsi_interp_coef position_coef;
+ struct tgsi_interp_coef *coef;
+};
+
+
+/* Rasterization information for a triangle known to be in this bin,
+ * plus inputs to run the shader:
+ */
+struct lp_rast_triangle {
+ /* one-pixel sized trivial accept offsets for each plane */
+ float ei1;
+ float ei2;
+ float ei3;
+
+ /* one-pixel sized trivial reject offsets for each plane */
+ float eo1;
+ float eo2;
+ float eo3;
+
+ /* y deltas for vertex pairs */
+ float dy12;
+ float dy23;
+ float dy31;
+
+ /* x deltas for vertex pairs */
+ float dx12;
+ float dx23;
+ float dx31;
+
+ /* State to run the shader: */
+ struct lp_rast_shader_inputs inputs;
+};
+
+
+
+struct lp_rasterizer *lp_rast_create( void );
+
+void lp_rast_bind_surfaces( struct lp_rasterizer *,
+ struct pipe_surface *color,
+ struct pipe_surface *zstencil,
+ const float *clear_color,
+ double clear_depth,
+ unsigned clear_stencil);
+
+/* Begining of each tile:
+ */
+void lp_rast_start_tile( struct lp_rasterizer *,
+ unsigned x,
+ unsigned y );
+
+
+
+union lp_rast_cmd_arg {
+ const struct lp_rast_shader_inputs *shade_tile;
+ const struct lp_rast_triangle *triangle;
+ const struct lp_rast_state *set_state;
+};
+
+
+/* Binnable Commands:
+ */
+void lp_rast_clear_color( struct lp_rasterizer *,
+ const union lp_rast_cmd_arg *);
+
+void lp_rast_clear_zstencil( struct lp_rasterizer *,
+ const union lp_rast_cmd_arg *);
+
+void lp_rast_load_color( struct lp_rasterizer *,
+ const union lp_rast_cmd_arg *);
+
+void lp_rast_load_zstencil( struct lp_rasterizer *,
+ const union lp_rast_cmd_arg *);
+
+void lp_rast_set_state( struct lp_rasterizer *,
+ const union lp_rast_cmd_arg * );
+
+void lp_rast_triangle( struct lp_rasterizer *,
+ const union lp_rast_cmd_arg * );
+
+void lp_rast_shade_tile( struct lp_rasterizer *,
+ const union lp_rast_cmd_arg * );
+
+void lp_rast_store_color( struct lp_rasterizer *,
+ const union lp_rast_cmd_arg *);
+
+void lp_rast_store_zstencil( struct lp_rasterizer *,
+ const union lp_rast_cmd_arg *);
+
+
+/* Shutdown:
+ */
+void lp_rast_destroy( struct lp_rasterizer * );
+
+
+#endif