Merge branch '7.8'
[mesa.git] / src / gallium / drivers / i965 / brw_context.h
index d033cb0f9102ddd743f325603651e960e27cad18..94c9c443f058c56ba72126a55c6de3c1922ed445 100644 (file)
 
 #define BRW_MAX_CURBE                    (32*16)
 
+
+/* Need a value to say a particular vertex shader output isn't
+ * present.  Limits us to 63 outputs currently.
+ */
+#define BRW_OUTPUT_NOT_PRESENT           ((1<<6)-1)
+
+
 struct brw_context;
 
 struct brw_depth_stencil_state {
@@ -146,26 +153,57 @@ struct brw_blend_state {
    struct brw_surf_ss0 ss0;
 };
 
-
 struct brw_rasterizer_state;
 
+struct brw_immediate_data {
+   unsigned nr;
+   float (*data)[4];
+};
 
 struct brw_vertex_shader {
    const struct tgsi_token *tokens;
+   struct brw_winsys_buffer *const_buffer;    /** Program constant buffer/surface */
+
    struct tgsi_shader_info info;
+   struct brw_immediate_data immediates;
+
+   GLuint has_flow_control:1;
+   GLuint use_const_buffer:1;
+
+   /* Offsets of special vertex shader outputs required for clipping.
+    */
+   GLuint output_hpos:6;        /* not always zero? */
+   GLuint output_color0:6;
+   GLuint output_color1:6;
+   GLuint output_bfc0:6;
+   GLuint output_bfc1:6;
+   GLuint output_edgeflag:6;
 
    unsigned id;
-   struct brw_winsys_buffer *const_buffer;    /** Program constant buffer/surface */
-   GLboolean use_const_buffer;
 };
 
+struct brw_fs_signature {
+   GLuint nr_inputs;
+   struct {
+      GLuint interp:3;          /* TGSI_INTERPOLATE_x */
+      GLuint semantic:5;        /* TGSI_SEMANTIC_x */
+      GLuint semantic_index:24;
+   } input[PIPE_MAX_SHADER_INPUTS];
+};
+
+#define brw_fs_signature_size(s) (offsetof(struct brw_fs_signature, input) + \
+                                  ((s)->nr_inputs * sizeof (s)->input[0])) 
+
 
 struct brw_fragment_shader {
    const struct tgsi_token *tokens;
    struct tgsi_shader_info info;
 
+   struct brw_fs_signature signature;
+   struct brw_immediate_data immediates;
+
    unsigned iz_lookup;
-   //unsigned wm_lookup;
+   /*unsigned wm_lookup;*/
    
    unsigned  uses_depth:1;
    unsigned  has_flow_control:1;
@@ -177,9 +215,9 @@ struct brw_fragment_shader {
 
 
 struct brw_sampler {
-   float border_color[4];
    struct brw_ss0 ss0;
    struct brw_ss1 ss1;
+   float border_color[4];
    struct brw_ss3 ss3;
 };
 
@@ -207,6 +245,8 @@ struct brw_sampler {
 #define PIPE_NEW_QUERY                  0x80000
 #define PIPE_NEW_SCISSOR                0x100000
 #define PIPE_NEW_BOUND_TEXTURES         0x200000
+#define PIPE_NEW_NR_CBUFS               0x400000
+#define PIPE_NEW_FRAGMENT_SIGNATURE     0x800000
 
 
 
@@ -223,7 +263,7 @@ struct brw_sampler {
 #define BRW_NEW_WM_SURFACES            0x1000
 #define BRW_NEW_xxx                     0x2000 /* was FENCE */
 #define BRW_NEW_INDICES                        0x4000
-#define BRW_NEW_VERTICES               0x8000
+
 /**
  * Used for any batch entry with a relocated pointer that will be used
  * by any 3D rendering.  Need to re-emit these fresh in each
@@ -301,7 +341,6 @@ struct brw_vs_prog_data {
 
    GLuint nr_params;       /**< number of TGSI_FILE_CONSTANT's */
 
-   GLboolean copy_edgeflag;
    GLboolean writes_psiz;
 
    /* Used for calculating urb partitions:
@@ -312,7 +351,7 @@ struct brw_vs_prog_data {
 
 /* Size == 0 if output either not written, or always [0,0,0,1]
  */
-struct brw_vs_ouput_sizes {
+struct brw_vs_output_sizes {
    GLubyte output_size[PIPE_MAX_SHADER_OUTPUTS];
 };
 
@@ -320,20 +359,23 @@ struct brw_vs_ouput_sizes {
 /** Number of texture sampler units */
 #define BRW_MAX_TEX_UNIT 16
 
+/** Max number of render targets in a shader */
+#define BRW_MAX_DRAW_BUFFERS 4
+
 /**
  * Size of our surface binding table for the WM.
  * This contains pointers to the drawing surfaces and current texture
  * objects and shader constant buffers (+2).
  */
-#define BRW_WM_MAX_SURF (PIPE_MAX_COLOR_BUFS + BRW_MAX_TEX_UNIT + 1)
+#define BRW_WM_MAX_SURF (BRW_MAX_DRAW_BUFFERS + BRW_MAX_TEX_UNIT + 1)
 
 /**
  * Helpers to convert drawing buffers, textures and constant buffers
  * to surface binding table indexes, for WM.
  */
-#define SURF_INDEX_DRAW(d)           (d)
-#define SURF_INDEX_FRAG_CONST_BUFFER (PIPE_MAX_COLOR_BUFS) 
-#define SURF_INDEX_TEXTURE(t)        (PIPE_MAX_COLOR_BUFS + 1 + (t))
+#define BTI_COLOR_BUF(d)          (d)
+#define BTI_FRAGMENT_CONSTANTS    (BRW_MAX_DRAW_BUFFERS) 
+#define BTI_TEXTURE(t)            (BRW_MAX_DRAW_BUFFERS + 1 + (t))
 
 /**
  * Size of surface binding table for the VS.
@@ -347,25 +389,27 @@ struct brw_vs_ouput_sizes {
 #define SURF_INDEX_VERT_CONST_BUFFER 0
 
 
+/* Bit of a hack to align these with the winsys buffer_data_type enum.
+ */
 enum brw_cache_id {
-   BRW_CC_VP,
-   BRW_CC_UNIT,
-   BRW_WM_PROG,
-   BRW_SAMPLER_DEFAULT_COLOR,
-   BRW_SAMPLER,
-   BRW_WM_UNIT,
-   BRW_SF_PROG,
-   BRW_SF_VP,
-   BRW_SF_UNIT,
-   BRW_VS_UNIT,
-   BRW_VS_PROG,
-   BRW_GS_UNIT,
-   BRW_GS_PROG,
-   BRW_CLIP_VP,
-   BRW_CLIP_UNIT,
-   BRW_CLIP_PROG,
-   BRW_SS_SURFACE,
-   BRW_SS_SURF_BIND,
+   BRW_CC_VP         = BRW_DATA_GS_CC_VP,
+   BRW_CC_UNIT       = BRW_DATA_GS_CC_UNIT,
+   BRW_WM_PROG       = BRW_DATA_GS_WM_PROG,
+   BRW_SAMPLER_DEFAULT_COLOR    = BRW_DATA_GS_SAMPLER_DEFAULT_COLOR,
+   BRW_SAMPLER       = BRW_DATA_GS_SAMPLER,
+   BRW_WM_UNIT       = BRW_DATA_GS_WM_UNIT,
+   BRW_SF_PROG       = BRW_DATA_GS_SF_PROG,
+   BRW_SF_VP         = BRW_DATA_GS_SF_VP,
+   BRW_SF_UNIT       = BRW_DATA_GS_SF_UNIT,
+   BRW_VS_UNIT       = BRW_DATA_GS_VS_UNIT,
+   BRW_VS_PROG       = BRW_DATA_GS_VS_PROG,
+   BRW_GS_UNIT       = BRW_DATA_GS_GS_UNIT,
+   BRW_GS_PROG       = BRW_DATA_GS_GS_PROG,
+   BRW_CLIP_VP       = BRW_DATA_GS_CLIP_VP,
+   BRW_CLIP_UNIT     = BRW_DATA_GS_CLIP_UNIT,
+   BRW_CLIP_PROG     = BRW_DATA_GS_CLIP_PROG,
+   BRW_SS_SURFACE    = BRW_DATA_SS_SURFACE,
+   BRW_SS_SURF_BIND  = BRW_DATA_SS_SURF_BIND,
 
    BRW_MAX_CACHE
 };
@@ -381,8 +425,8 @@ struct brw_cache_item {
    GLuint hash;
    GLuint key_size;            /* for variable-sized keys */
    const void *key;
-   struct brw_winsys_buffer **reloc_bufs;
-   GLuint nr_reloc_bufs;
+   struct brw_winsys_reloc *relocs;
+   GLuint nr_relocs;
 
    struct brw_winsys_buffer *bo;
    GLuint data_size;
@@ -399,6 +443,8 @@ struct brw_cache {
    struct brw_cache_item **items;
    GLuint size, n_items;
 
+   enum brw_buffer_type buffer_type;
+
    GLuint key_size[BRW_MAX_CACHE];             /* for fixed-size keys */
    GLuint aux_size[BRW_MAX_CACHE];
    char *name[BRW_MAX_CACHE];
@@ -474,6 +520,8 @@ struct brw_query_object {
    uint64_t result;
 };
 
+#define CC_RELOC_VP 0
+
 
 /**
  * brw_context is derived from pipe_context
@@ -483,7 +531,6 @@ struct brw_context
    struct pipe_context base;
    struct brw_chipset chipset;
 
-   struct brw_screen *brw_screen;   
    struct brw_winsys_screen *sws;
 
    struct brw_batchbuffer *batch;
@@ -499,36 +546,35 @@ struct brw_context
       const struct brw_blend_state *blend;
       const struct brw_rasterizer_state *rast;
       const struct brw_depth_stencil_state *zstencil;
+      const struct brw_vertex_element_packet *velems;
 
       const struct brw_sampler *sampler[PIPE_MAX_SAMPLERS];
       unsigned num_samplers;
 
-      struct pipe_texture *texture[PIPE_MAX_SAMPLERS];
+      struct pipe_sampler_view *fragment_sampler_views[PIPE_MAX_SAMPLERS];
       struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
-      struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
-      unsigned num_vertex_elements;
-      unsigned num_textures;
+      unsigned num_fragment_sampler_views;
       unsigned num_vertex_buffers;
 
       struct pipe_scissor_state scissor;
+      struct pipe_viewport_state viewport;
+      struct pipe_stencil_ref stencil_ref;
       struct pipe_framebuffer_state fb;
-      struct pipe_viewport_state vp;
       struct pipe_clip_state ucp;
-      struct pipe_buffer *vertex_constants;
-      struct pipe_buffer *fragment_constants;
+      struct pipe_resource *vertex_constants;
+      struct pipe_resource *fragment_constants;
 
-      struct pipe_viewport_state viewport;
       struct brw_blend_constant_color bcc;
+      struct brw_cc1 cc1_stencil_ref;
       struct brw_polygon_stipple bps;
-
-      
+      struct brw_cc_viewport ccv;
 
       /**
        * Index buffer for this draw_prims call.
        *
        * Updates are signaled by PIPE_NEW_INDEX_BUFFER.
        */
-      struct pipe_buffer *index_buffer;
+      struct pipe_resource *index_buffer;
       unsigned index_size;
 
       /* Updates are signalled by PIPE_NEW_INDEX_RANGE:
@@ -572,12 +618,7 @@ struct brw_context
         struct brw_winsys_buffer *bo;
       } vb[PIPE_MAX_ATTRIBS];
 
-      struct {
-         int dummy;
-      } ve[PIPE_MAX_ATTRIBS];
-
       unsigned nr_vb;          /* currently the same as curr.num_vertex_buffers */
-      unsigned nr_ve;          /* currently the same as curr.num_vertex_elements */
    } vb;
 
    struct {
@@ -686,7 +727,7 @@ struct brw_context
       /** Input sizes, calculated from active vertex program.
        * One bit per fragment program input attribute.
        */
-      //GLbitfield input_size_masks[4];
+      /*GLbitfield input_size_masks[4];*/
 
       /** Array of surface default colors (texture border color) */
       struct brw_winsys_buffer *sdc_bo[BRW_MAX_TEX_UNIT];
@@ -702,7 +743,7 @@ struct brw_context
 
       /** Binding table of pointers to surf_bo entries */
       struct brw_winsys_buffer *bind_bo;
-      struct brw_winsys_buffer *surf_bo[PIPE_MAX_COLOR_BUFS];
+      struct brw_winsys_buffer *surf_bo[BRW_WM_MAX_SURF];
 
       struct brw_winsys_buffer *prog_bo;
       struct brw_winsys_buffer *state_bo;
@@ -710,9 +751,10 @@ struct brw_context
 
 
    struct {
-      struct brw_winsys_buffer *prog_bo;
       struct brw_winsys_buffer *state_bo;
-      struct brw_winsys_buffer *vp_bo;
+
+      struct brw_cc_unit_state cc;
+      struct brw_winsys_reloc reloc[1];
    } cc;
 
    struct {
@@ -741,7 +783,7 @@ struct brw_context
  * brw_queryobj.c
  */
 void brw_init_query(struct brw_context *brw);
-void brw_prepare_query_begin(struct brw_context *brw);
+enum pipe_error brw_prepare_query_begin(struct brw_context *brw);
 void brw_emit_query_begin(struct brw_context *brw);
 void brw_emit_query_end(struct brw_context *brw);
 
@@ -766,6 +808,7 @@ void brw_pipe_shader_init( struct brw_context *brw );
 void brw_pipe_vertex_init( struct brw_context *brw );
 void brw_pipe_clear_init( struct brw_context *brw );
 
+
 void brw_pipe_blend_cleanup( struct brw_context *brw );
 void brw_pipe_depth_stencil_cleanup( struct brw_context *brw );
 void brw_pipe_framebuffer_cleanup( struct brw_context *brw );
@@ -778,6 +821,10 @@ void brw_pipe_shader_cleanup( struct brw_context *brw );
 void brw_pipe_vertex_cleanup( struct brw_context *brw );
 void brw_pipe_clear_cleanup( struct brw_context *brw );
 
+void brw_hw_cc_init( struct brw_context *brw );
+void brw_hw_cc_cleanup( struct brw_context *brw );
+
+
 
 void brw_context_flush( struct brw_context *brw );
 
@@ -790,8 +837,10 @@ int brw_upload_urb_fence(struct brw_context *brw);
  */
 int brw_upload_cs_urb_state(struct brw_context *brw);
 
-/* brw_disasm.c */
-int brw_disasm (FILE *file, struct brw_instruction *inst);
+/* brw_context.c
+ */
+struct pipe_context *brw_create_context(struct pipe_screen *screen,
+                                       void *priv);
 
 /*======================================================================
  * Inline conversion functions.  These are better-typed than the