summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/i915/intel_state.c
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2004-06-10 12:48:07 +0000
committerKeith Whitwell <keith@tungstengraphics.com>2004-06-10 12:48:07 +0000
commit41b58954e1742493452b91d9ecdb761db5de3bed (patch)
treef170cda67626d1a0d4e7e51ea502553b0f144077 /src/mesa/drivers/dri/i915/intel_state.c
parentd7f76c7c8830882d849b42777ca601859ffac15a (diff)
New driver for i915 as well as older i830/i845/i865 chipsets.
Diffstat (limited to 'src/mesa/drivers/dri/i915/intel_state.c')
-rw-r--r--src/mesa/drivers/dri/i915/intel_state.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i915/intel_state.c b/src/mesa/drivers/dri/i915/intel_state.c
new file mode 100644
index 0000000000..23e49553ab
--- /dev/null
+++ b/src/mesa/drivers/dri/i915/intel_state.c
@@ -0,0 +1,135 @@
+/**************************************************************************
+ *
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ **************************************************************************/
+
+
+#include "glheader.h"
+#include "context.h"
+#include "macros.h"
+#include "enums.h"
+#include "dd.h"
+
+#include "intel_screen.h"
+#include "intel_context.h"
+#include "swrast/swrast.h"
+
+
+static void intelDrawBuffer(GLcontext *ctx, GLenum mode )
+{
+ intelContextPtr intel = INTEL_CONTEXT(ctx);
+ intelScreenPrivate *screen = intel->intelScreen;
+ int front = 0;
+
+ switch ( ctx->Color._DrawDestMask ) {
+ case DD_FRONT_LEFT_BIT:
+ front = 1;
+ FALLBACK( intel, INTEL_FALLBACK_DRAW_BUFFER, GL_FALSE );
+ break;
+ case DD_BACK_LEFT_BIT:
+ front = 0;
+ FALLBACK( intel, INTEL_FALLBACK_DRAW_BUFFER, GL_FALSE );
+ break;
+ default:
+ FALLBACK( intel, INTEL_FALLBACK_DRAW_BUFFER, GL_TRUE );
+ return;
+ }
+
+ /* We want to update the s/w rast state too so that r200SetBuffer()
+ * gets called.
+ */
+ _swrast_DrawBuffer(ctx, mode);
+
+ if ( intel->sarea->pf_current_page == 1 )
+ front ^= 1;
+
+ intelSetFrontClipRects( intel );
+
+ if (front) {
+ intel->drawOffset = screen->frontOffset;
+ intel->drawMap = (char *)intel->driScreen->pFB;
+ intel->readMap = (char *)intel->driScreen->pFB;
+ } else {
+ intel->drawOffset = screen->backOffset;
+ intel->drawMap = screen->back.map;
+ intel->readMap = screen->back.map;
+ }
+
+ intel->vtbl.set_draw_offset( intel, intel->drawOffset );
+}
+
+static void intelReadBuffer( GLcontext *ctx, GLenum mode )
+{
+ /* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */
+}
+
+
+static void intelClearColor(GLcontext *ctx, const GLfloat color[4])
+{
+ intelContextPtr intel = INTEL_CONTEXT(ctx);
+ intelScreenPrivate *screen = intel->intelScreen;
+
+ CLAMPED_FLOAT_TO_UBYTE(intel->clear_red, color[0]);
+ CLAMPED_FLOAT_TO_UBYTE(intel->clear_green, color[1]);
+ CLAMPED_FLOAT_TO_UBYTE(intel->clear_blue, color[2]);
+ CLAMPED_FLOAT_TO_UBYTE(intel->clear_alpha, color[3]);
+
+ intel->ClearColor = INTEL_PACKCOLOR(screen->fbFormat,
+ intel->clear_red,
+ intel->clear_green,
+ intel->clear_blue,
+ intel->clear_alpha);
+}
+
+
+static void intelCalcViewport( GLcontext *ctx )
+{
+ intelContextPtr intel = INTEL_CONTEXT(ctx);
+ const GLfloat *v = ctx->Viewport._WindowMap.m;
+ GLfloat *m = intel->ViewportMatrix.m;
+
+ /* See also intel_translate_vertex. SUBPIXEL adjustments can be done
+ * via state vars, too.
+ */
+ m[MAT_SX] = v[MAT_SX];
+ m[MAT_TX] = v[MAT_TX] + SUBPIXEL_X;
+ m[MAT_SY] = - v[MAT_SY];
+ m[MAT_TY] = - v[MAT_TY] + intel->driDrawable->h + SUBPIXEL_Y;
+ m[MAT_SZ] = v[MAT_SZ] * intel->depth_scale;
+ m[MAT_TZ] = v[MAT_TZ] * intel->depth_scale;
+}
+
+static void intelViewport( GLcontext *ctx,
+ GLint x, GLint y,
+ GLsizei width, GLsizei height )
+{
+ intelCalcViewport( ctx );
+}
+
+static void intelDepthRange( GLcontext *ctx,
+ GLclampd nearval, GLclampd farval )
+{
+ intelCalcViewport( ctx );
+}
+
+/* Fallback to swrast for select and feedback.
+ */
+static void intelRenderMode( GLcontext *ctx, GLenum mode )
+{
+ intelContextPtr intel = INTEL_CONTEXT(ctx);
+ FALLBACK( intel, INTEL_FALLBACK_RENDERMODE, (mode != GL_RENDER) );
+}
+
+
+void intelInitStateFuncs( struct dd_function_table *functions )
+{
+ functions->DrawBuffer = intelDrawBuffer;
+ functions->ReadBuffer = intelReadBuffer;
+ functions->RenderMode = intelRenderMode;
+ functions->Viewport = intelViewport;
+ functions->DepthRange = intelDepthRange;
+ functions->ClearColor = intelClearColor;
+}
+