dri/nouveau: Split out the scratch helpers to a separate file.
[mesa.git] / src / mesa / drivers / dri / nouveau / nouveau_context.h
index db4d4cb6b71016b6fe6f68ecb351301d4cd17166..7ebc676379e5e8ec0428167ff23d112157702fb7 100644 (file)
-/**************************************************************************
-
-Copyright 2006 Stephane Marchesin
-All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-on the rights to use, copy, modify, merge, publish, distribute, sub
-license, and/or sell copies of the Software, and to permit persons to whom
-the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice (including the next
-paragraph) shall be included in all copies or substantial portions of the
-Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
-ERIC ANHOLT OR SILICON INTEGRATED SYSTEMS CORP BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-**************************************************************************/
-
-
+/*
+ * Copyright (C) 2009 Francisco Jerez.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
 
 #ifndef __NOUVEAU_CONTEXT_H__
 #define __NOUVEAU_CONTEXT_H__
 
-#include "dri_util.h"
-#include "drm.h"
-#include "nouveau_drm.h"
-
-#include "mtypes.h"
-#include "tnl/t_vertex.h"
-
 #include "nouveau_screen.h"
-#include "nouveau_state_cache.h"
-#include "nouveau_buffers.h"
-#include "nouveau_shader.h"
-#include "nouveau_sync.h"
-
-#include "xmlconfig.h"
-
-typedef struct nouveau_fifo_t{
-       int channel;
-       uint32_t* buffer;
-       uint32_t* mmio;
-       uint32_t put_base;
-       uint32_t current;
-       uint32_t put;
-       uint32_t free;
-       uint32_t max;
-}
-nouveau_fifo;
-
-#define TAG(x) nouveau##x
-#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*, 
-               nouveauVertex *,
-               nouveauVertex *,
-               nouveauVertex * );
-
-typedef void (*nouveau_line_func)( struct nouveau_context*, 
-               nouveauVertex *,
-               nouveauVertex * );
-
-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 */
-       GLcontext *glCtx;
-
-       /* The per-context fifo */
-       nouveau_fifo fifo;
-
-       /* 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_notifier_alloc *syncNotifier;
-
-       /* ARB_occlusion_query / EXT_timer_query */
-       GLuint            query_object_max;
-       GLboolean *       query_alloc;
-       struct drm_nouveau_notifier_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 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 */
-       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 */
-       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;
-       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;
-       int driFd;
-
-       /* Configuration cache */
-       driOptionCache optionCache;
-
-       /* 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,
-               void *sharedContextPrivate );
-
-extern void nouveauDestroyContext( __DRIcontextPrivate * );
-
-extern GLboolean nouveauMakeCurrent( __DRIcontextPrivate *driContextPriv,
-               __DRIdrawablePrivate *driDrawPriv,
-               __DRIdrawablePrivate *driReadPriv );
-
-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__ */
+#include "nouveau_state.h"
+#include "nouveau_bo_state.h"
+#include "nouveau_scratch.h"
+#include "nouveau_render.h"
+
+#include "main/bitset.h"
+
+enum nouveau_fallback {
+       HWTNL = 0,
+       SWTNL,
+       SWRAST,
+};
+
+struct nouveau_hw_state {
+       struct nouveau_channel *chan;
+
+       struct nouveau_notifier *ntfy;
+       struct nouveau_grobj *eng3d;
+       struct nouveau_grobj *eng3dm;
+       struct nouveau_grobj *surf3d;
+       struct nouveau_grobj *m2mf;
+       struct nouveau_grobj *surf2d;
+       struct nouveau_grobj *rop;
+       struct nouveau_grobj *patt;
+       struct nouveau_grobj *rect;
+       struct nouveau_grobj *swzsurf;
+       struct nouveau_grobj *sifm;
+};
+
+struct nouveau_context {
+       struct gl_context base;
+       __DRIcontext *dri_context;
+       struct nouveau_screen *screen;
+
+       BITSET_DECLARE(dirty, MAX_NOUVEAU_STATE);
+       enum nouveau_fallback fallback;
+
+       struct nouveau_hw_state hw;
+       struct nouveau_bo_state bo;
+       struct nouveau_render_state render;
+       struct nouveau_scratch_state scratch;
+
+       struct {
+               GLboolean clear_blocked;
+               int clear_seq;
+       } hierz;
+};
+
+#define to_nouveau_context(ctx)        ((struct nouveau_context *)(ctx))
+
+#define context_dev(ctx) \
+       (to_nouveau_context(ctx)->screen->device)
+#define context_chipset(ctx) \
+       (context_dev(ctx)->chipset)
+#define context_chan(ctx) \
+       (to_nouveau_context(ctx)->hw.chan)
+#define context_eng3d(ctx) \
+       (to_nouveau_context(ctx)->hw.eng3d)
+#define context_drv(ctx) \
+       (to_nouveau_context(ctx)->screen->driver)
+#define context_dirty(ctx, s) \
+       BITSET_SET(to_nouveau_context(ctx)->dirty, NOUVEAU_STATE_##s)
+#define context_dirty_i(ctx, s, i) \
+       BITSET_SET(to_nouveau_context(ctx)->dirty, NOUVEAU_STATE_##s##0 + i)
+#define context_emit(ctx, s) \
+       context_drv(ctx)->emit[NOUVEAU_STATE_##s](ctx, NOUVEAU_STATE_##s)
+
+GLboolean
+nouveau_context_create(gl_api api,
+                      const struct gl_config *visual, __DRIcontext *dri_ctx,
+                      void *share_ctx);
+
+GLboolean
+nouveau_context_init(struct gl_context *ctx, struct nouveau_screen *screen,
+                    const struct gl_config *visual, struct gl_context *share_ctx);
+
+void
+nouveau_context_deinit(struct gl_context *ctx);
+
+void
+nouveau_context_destroy(__DRIcontext *dri_ctx);
+
+void
+nouveau_update_renderbuffers(__DRIcontext *dri_ctx, __DRIdrawable *draw);
+
+GLboolean
+nouveau_context_make_current(__DRIcontext *dri_ctx, __DRIdrawable *ddraw,
+                            __DRIdrawable *rdraw);
+
+GLboolean
+nouveau_context_unbind(__DRIcontext *dri_ctx);
+
+void
+nouveau_fallback(struct gl_context *ctx, enum nouveau_fallback mode);
+
+void
+nouveau_validate_framebuffer(struct gl_context *ctx);
+
+#endif