r300g: only check for an empty shader if there are no compile errors
[mesa.git] / src / gallium / drivers / r600 / r600_context.h
index 9427c19d059641e6456c9c8ebf23a7e530e68961..dc4e948e8daee8bb10076bb50e8b7d70613e1bb1 100644 (file)
 #include <tgsi/tgsi_parse.h>
 #include <tgsi/tgsi_util.h>
 #include <util/u_blitter.h>
+#include <util/u_double_list.h>
 #include "radeon.h"
 #include "r600_shader.h"
 
+#define R600_QUERY_STATE_STARTED       (1 << 0)
+#define R600_QUERY_STATE_ENDED         (1 << 1)
+#define R600_QUERY_STATE_SUSPENDED     (1 << 2)
+
+struct r600_query {
+       u64                                     result;
+       /* The kind of query. Currently only OQ is supported. */
+       unsigned                                type;
+       /* How many results have been written, in dwords. It's incremented
+        * after end_query and flush. */
+       unsigned                                num_results;
+       /* if we've flushed the query */
+       boolean                                 flushed;
+       unsigned                                state;
+       /* The buffer where query results are stored. */
+       struct radeon_bo                        *buffer;
+       unsigned                                buffer_size;
+       /* linked list of queries */
+       struct list_head                        list;
+       struct radeon_state                     rstate;
+};
+
 /* XXX move this to a more appropriate place */
 union pipe_states {
        struct pipe_rasterizer_state            rasterizer;
@@ -72,13 +95,16 @@ enum pipe_state_type {
        pipe_type_count
 };
 
+#define R600_MAX_RSTATE                16
+
 struct r600_context_state {
        union pipe_states               state;
        unsigned                        refcount;
        unsigned                        type;
-       struct radeon_state             *rstate;
+       struct radeon_state             rstate[R600_MAX_RSTATE];
        struct r600_shader              shader;
        struct radeon_bo                *bo;
+       unsigned                        nrstate;
 };
 
 struct r600_vertex_element
@@ -89,53 +115,42 @@ struct r600_vertex_element
 };
 
 struct r600_context_hw_states {
-       struct radeon_state     *rasterizer;
-       struct radeon_state     *scissor;
-       struct radeon_state     *dsa;
-       struct radeon_state     *blend;
-       struct radeon_state     *viewport;
-       struct radeon_state     *cb0;
-       struct radeon_state     *config;
-       struct radeon_state     *cb_cntl;
-       struct radeon_state     *db;
-       unsigned                ps_nresource;
-       unsigned                ps_nsampler;
-       struct radeon_state     *ps_resource[160];
-       struct radeon_state     *ps_sampler[16];
+       struct radeon_state     rasterizer;
+       struct radeon_state     scissor;
+       struct radeon_state     dsa;
+       struct radeon_state     cb_cntl;
+};
+
+#define R600_MAX_CONSTANT 256 /* magic */
+#define R600_MAX_RESOURCE 160 /* magic */
+
+struct r600_shader_sampler_states {
+       unsigned                        nsampler;
+       unsigned                        nview;
+       unsigned                        nborder;
+       struct radeon_state             *sampler[PIPE_MAX_ATTRIBS];
+       struct radeon_state             *view[PIPE_MAX_ATTRIBS];
+       struct radeon_state             *border[PIPE_MAX_ATTRIBS];
 };
 
 struct r600_context {
        struct pipe_context             context;
        struct r600_screen              *screen;
        struct radeon                   *rw;
-       struct radeon_ctx               *ctx;
+       struct radeon_ctx               ctx;
        struct blitter_context          *blitter;
-       struct radeon_draw              *draw;
+       struct radeon_draw              draw;
+       struct radeon_state             config;
+       /* FIXME get rid of those vs_resource,vs/ps_constant */
+       struct radeon_state             *vs_resource;
+       unsigned                        vs_nresource;
+       struct radeon_state             *vs_constant;
+       struct radeon_state             *ps_constant;
        /* hw states */
        struct r600_context_hw_states   hw_states;
-#if 0
-       struct r600_pipe_shader         *ps_shader;
-       struct r600_pipe_shader         *vs_shader;
-       unsigned                        nps_sampler;
-       struct radeon_state             *ps_sampler[PIPE_MAX_ATTRIBS];
-       unsigned                        nps_view;
-       unsigned                        nvs_view;
-       struct r600_texture_resource    *ps_view[PIPE_MAX_ATTRIBS];
-       struct r600_texture_resource    *vs_view[PIPE_MAX_ATTRIBS];
-       unsigned                        flat_shade;
-       unsigned                        nvertex_buffer;
-       struct r600_vertex_elements_state *vertex_elements;
-       struct pipe_vertex_buffer       vertex_buffer[PIPE_MAX_ATTRIBS];
-       struct pipe_stencil_ref         stencil_ref;
-       struct pipe_framebuffer_state   fb_state;
-       struct pipe_viewport_state      viewport;
-#endif
        /* pipe states */
        unsigned                        flat_shade;
-       unsigned                        ps_nsampler;
-       unsigned                        vs_nsampler;
-       unsigned                        ps_nsampler_view;
-       unsigned                        vs_nsampler_view;
+
        unsigned                        nvertex_buffer;
        struct r600_context_state       *rasterizer;
        struct r600_context_state       *poly_stipple;
@@ -151,57 +166,34 @@ struct r600_context {
        struct r600_context_state       *stencil_ref;
        struct r600_context_state       *viewport;
        struct r600_context_state       *framebuffer;
-       struct r600_context_state       *ps_sampler[PIPE_MAX_ATTRIBS];
-       struct r600_context_state       *vs_sampler[PIPE_MAX_ATTRIBS];
-       struct r600_context_state       *ps_sampler_view[PIPE_MAX_ATTRIBS];
-       struct r600_context_state       *vs_sampler_view[PIPE_MAX_ATTRIBS];
+       struct r600_shader_sampler_states vs_sampler;
+       struct r600_shader_sampler_states ps_sampler;
+       /* can add gs later */
        struct r600_vertex_element      *vertex_elements;
        struct pipe_vertex_buffer       vertex_buffer[PIPE_MAX_ATTRIBS];
        struct pipe_index_buffer        index_buffer;
+       struct pipe_blend_color         blend_color;
+       struct list_head                query_list;
 };
 
-#if 0
-struct r600_vertex_elements_state
-{
-       unsigned count;
-       struct pipe_vertex_element      elements[32];
-};
-
-struct r600_pipe_shader {
-       struct r600_shader              shader;
-       struct radeon_bo                *bo;
-       struct radeon_state             *state;
-};
-
-struct r600_texture_resource {
-       struct pipe_sampler_view        view;
-       struct radeon_state             *state;
-};
-#endif
-
 /* Convenience cast wrapper. */
 static INLINE struct r600_context *r600_context(struct pipe_context *pipe)
 {
     return (struct r600_context*)pipe;
 }
 
-struct r600_context_state *r600_context_state(struct r600_context *rctx, unsigned type, const void *state);
+static INLINE struct r600_query* r600_query(struct pipe_query* q)
+{
+    return (struct r600_query*)q;
+}
+
 struct r600_context_state *r600_context_state_incref(struct r600_context_state *rstate);
 struct r600_context_state *r600_context_state_decref(struct r600_context_state *rstate);
+void r600_flush(struct pipe_context *ctx, unsigned flags,
+                       struct pipe_fence_handle **fence);
+
+int r600_context_hw_states(struct pipe_context *ctx);
 
-int r600_context_hw_states(struct r600_context *rctx);
-
-void r600_draw_arrays(struct pipe_context *ctx, unsigned mode,
-                       unsigned start, unsigned count);
-void r600_draw_elements(struct pipe_context *ctx,
-               struct pipe_resource *index_buffer,
-               unsigned index_size, int index_bias, unsigned mode,
-               unsigned start, unsigned count);
-void r600_draw_range_elements(struct pipe_context *ctx,
-               struct pipe_resource *index_buffer,
-               unsigned index_size, int index_bias, unsigned min_index,
-               unsigned max_index, unsigned mode,
-               unsigned start, unsigned count);
 void r600_draw_vbo(struct pipe_context *ctx,
                    const struct pipe_draw_info *info);
 
@@ -210,13 +202,22 @@ void r600_init_state_functions(struct r600_context *rctx);
 void r600_init_query_functions(struct r600_context* rctx);
 struct pipe_context *r600_create_context(struct pipe_screen *screen, void *priv);
 
-int r600_pipe_shader_create(struct pipe_context *ctx,
+extern int r600_pipe_shader_create(struct pipe_context *ctx,
                        struct r600_context_state *rstate,
                        const struct tgsi_token *tokens);
-int r600_pipe_shader_update(struct pipe_context *ctx,
+extern int r600_pipe_shader_update(struct pipe_context *ctx,
                                struct r600_context_state *rstate);
 
 #define R600_ERR(fmt, args...) \
        fprintf(stderr, "EE %s/%s:%d - "fmt, __FILE__, __func__, __LINE__, ##args)
 
+uint32_t r600_translate_texformat(enum pipe_format format,
+                                 const unsigned char *swizzle_view, 
+                                 uint32_t *word4_p, uint32_t *yuv_format_p);
+
+/* query */
+extern void r600_queries_resume(struct pipe_context *ctx);
+extern void r600_queries_suspend(struct pipe_context *ctx);
+
+
 #endif