nouveau: Split nouveau_buffers into nouveau_mem and nouveau_fbo
[mesa.git] / src / mesa / drivers / dri / nouveau / nouveau_context.h
index 83ac2fd45568d0ba2940ab2ddfe87f806491a590..03f778a13c469c6a529f636f90fea44447f0737d 100644 (file)
@@ -36,13 +36,19 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "mtypes.h"
 #include "tnl/t_vertex.h"
 
-#include "nouveau_reg.h"
+#include "nouveau_fbo.h"
 #include "nouveau_screen.h"
+#include "nouveau_shader.h"
+#include "nouveau_state_cache.h"
+#include "nouveau_sync.h"
 
 #include "xmlconfig.h"
 
 typedef struct nouveau_fifo_t{
+       int channel;
        u_int32_t* buffer;
+       u_int32_t* mmio;
+       u_int32_t put_base;
        u_int32_t current;
        u_int32_t put;
        u_int32_t free;
@@ -54,6 +60,10 @@ nouveau_fifo;
 #include "tnl_dd/t_dd_vertex.h"
 #undef TAG
 
+/* Subpixel offsets for window coordinates (triangles): */
+#define SUBPIXEL_X  (0.0F)
+#define SUBPIXEL_Y  (0.125F)
+
 struct nouveau_context;
 
 typedef void (*nouveau_tri_func)( struct nouveau_context*, 
@@ -68,6 +78,16 @@ typedef void (*nouveau_line_func)( struct nouveau_context*,
 typedef void (*nouveau_point_func)( struct nouveau_context*,
                nouveauVertex * );
 
+typedef struct nouveau_hw_func_t {
+       /* Initialise any card-specific non-GL related state */
+       GLboolean (*InitCard)(struct nouveau_context *);
+       /* Update buffer offset/pitch/format */
+       GLboolean (*BindBuffers)(struct nouveau_context *, int num_color,
+                                nouveau_renderbuffer **color,
+                                nouveau_renderbuffer *depth);
+       /* Update anything that depends on the window position/size */
+       void      (*WindowMoved)(struct nouveau_context *);
+} nouveau_hw_func;
 
 typedef struct nouveau_context {
        /* Mesa context */
@@ -76,36 +96,84 @@ typedef struct nouveau_context {
        /* The per-context fifo */
        nouveau_fifo fifo;
 
-       /* The fifo control regs */
-       volatile unsigned char* fifo_mmio;
-
        /* The read-only regs */
        volatile unsigned char* mmio;
 
+       /* The per-channel notifier block */
+       volatile void *notifier_block;
+
+       /* Physical addresses of AGP/VRAM apertures */
+       uint64_t vram_phys;
+       uint64_t vram_size;
+       uint64_t gart_phys;
+       uint64_t gart_size;
+
+       /* Channel synchronisation */
+       struct drm_nouveau_notifierobj_alloc *syncNotifier;
+
+       /* ARB_occlusion_query / EXT_timer_query */
+       GLuint            query_object_max;
+       GLboolean *       query_alloc;
+       struct drm_nouveau_notifierobj_alloc *queryNotifier;
+
+       /* Additional hw-specific functions */
+       nouveau_hw_func hw_func;
+
+       /* FIXME : do we want to put all state into a separate struct ? */
        /* State for tris */
-       GLuint vertex_size;
        GLuint color_offset;
        GLuint specular_offset;
 
+       /* Vertex state */
+       GLuint vertex_size;
+       GLubyte *verts;
+       struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX];
+       GLuint vertex_attr_count;
+
+       /* Color buffer clear value */
+       uint32_t clear_color_value;
+
+       /* Depth/stencil clear value */
+       uint32_t clear_value;
+
+       /* Light state */
+       GLboolean lighting_enabled;
+       uint32_t enabled_lights;
+
+       /* Cached state */
+       nouveau_state_cache state_cache;
+
        /* The drawing fallbacks */
-       nouveau_tri_func* draw_tri;
-       nouveau_line_func* draw_line;
-       nouveau_point_func* draw_point;
+       GLuint Fallback;
+       nouveau_tri_func draw_tri;
+       nouveau_line_func draw_line;
+       nouveau_point_func draw_point;
 
        /* Cliprects information */
        GLuint numClipRects;
        drm_clip_rect_t *pClipRects;
+       drm_clip_rect_t osClipRect;
+       GLuint drawX, drawY, drawW, drawH;
 
        /* The rendering context information */
        GLenum current_primitive; /* the current primitive enum */
-       GLuint render_inputs; /* the current render inputs */
+       DECLARE_RENDERINPUTS(render_inputs_bitset); /* the current render inputs */
+
+       /* Shader state */
+       nvsFunc VPfunc;
+       nvsFunc FPfunc;
+       nouveauShader *current_fragprog;
+       nouveauShader *current_vertprog;
+       nouveauShader *passthrough_vp;
+       nouveauShader *passthrough_fp;
 
        nouveauScreenRec *screen;
-       drm_nouveau_sarea_t *sarea;
+       struct drm_nouveau_sarea *sarea;
 
        __DRIcontextPrivate  *driContext;    /* DRI context */
        __DRIscreenPrivate   *driScreen;     /* DRI screen */
        __DRIdrawablePrivate *driDrawable;   /* DRI drawable bound to this ctx */
+       GLint lastStamp;
 
        drm_context_t hHWContext;
        drm_hw_lock_t *driHwLock;
@@ -114,11 +182,34 @@ typedef struct nouveau_context {
        /* Configuration cache */
        driOptionCache optionCache;
 
-        uint32_t vblank_flags;
+       /* vblank stuff */
+       uint32_t vblank_flags;
+       uint32_t vblank_seq;
+
+       GLuint new_state;
+       GLuint new_render_state;
+       GLuint render_index;
+       GLmatrix viewport;
+       GLfloat depth_scale;
+
 }nouveauContextRec, *nouveauContextPtr;
 
+
 #define NOUVEAU_CONTEXT(ctx)           ((nouveauContextPtr)(ctx->DriverCtx))
 
+/* Flags for software fallback cases: */
+#define NOUVEAU_FALLBACK_TEXTURE               0x0001
+#define NOUVEAU_FALLBACK_DRAW_BUFFER           0x0002
+#define NOUVEAU_FALLBACK_READ_BUFFER           0x0004
+#define NOUVEAU_FALLBACK_STENCIL               0x0008
+#define NOUVEAU_FALLBACK_RENDER_MODE           0x0010
+#define NOUVEAU_FALLBACK_LOGICOP               0x0020
+#define NOUVEAU_FALLBACK_SEP_SPECULAR          0x0040
+#define NOUVEAU_FALLBACK_BLEND_EQ              0x0080
+#define NOUVEAU_FALLBACK_BLEND_FUNC            0x0100
+#define NOUVEAU_FALLBACK_PROJTEX               0x0200
+#define NOUVEAU_FALLBACK_DISABLE               0x0400
+
 
 extern GLboolean nouveauCreateContext( const __GLcontextModes *glVisual,
                __DRIcontextPrivate *driContextPriv,
@@ -132,6 +223,17 @@ extern GLboolean nouveauMakeCurrent( __DRIcontextPrivate *driContextPriv,
 
 extern GLboolean nouveauUnbindContext( __DRIcontextPrivate *driContextPriv );
 
+extern void nouveauSwapBuffers(__DRIdrawablePrivate *dPriv);
+
+extern void nouveauCopySubBuffer(__DRIdrawablePrivate *dPriv,
+                                int x, int y, int w, int h);
+
+/* Debugging utils: */
+extern int NOUVEAU_DEBUG;
+
+#define DEBUG_SHADERS  0x00000001
+#define DEBUG_MEM      0x00000002
+#define DEBUG_BUFFEROBJ 0x00000004
 
 #endif /* __NOUVEAU_CONTEXT_H__ */