r100/r200: Bring back old PolygonStripple for DRI1.
authorPauli Nieminen <suokkos@gmail.com>
Fri, 28 Aug 2009 02:42:41 +0000 (05:42 +0300)
committerPauli Nieminen <suokkos@gmail.com>
Fri, 28 Aug 2009 02:42:41 +0000 (05:42 +0300)
DRI1 didn't have support for command buffer emit for stripple.

src/mesa/drivers/dri/r200/r200_context.c
src/mesa/drivers/dri/r200/r200_context.h
src/mesa/drivers/dri/r200/r200_state.c
src/mesa/drivers/dri/r200/r200_state.h
src/mesa/drivers/dri/radeon/radeon_common.c
src/mesa/drivers/dri/radeon/radeon_common.h
src/mesa/drivers/dri/radeon/radeon_common_context.h
src/mesa/drivers/dri/radeon/radeon_context.c
src/mesa/drivers/dri/radeon/radeon_context.h
src/mesa/drivers/dri/radeon/radeon_state.c
src/mesa/drivers/dri/radeon/radeon_state.h

index e8e7a42099b0f6163726caa4a7f7591a18aa149b..0898617a3dbcb39ba2d9379e265d7949262a46fd 100644 (file)
@@ -345,7 +345,7 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual,
    _mesa_init_driver_functions(&functions);
    r200InitDriverFuncs(&functions);
    r200InitIoctlFuncs(&functions);
-   r200InitStateFuncs(&functions);
+   r200InitStateFuncs(&functions, screen->kernel_mm);
    r200InitTextureFuncs(&functions);
    r200InitShaderFuncs(&functions); 
    radeonInitQueryObjFunctions(&functions);
index e26514b27a9e018149c4eeb1ffd20fc0e6257e74..c5dccf0a75a986354ef575e0e72dd9ea9deee436 100644 (file)
@@ -526,7 +526,6 @@ struct r200_hw_state {
 struct r200_state {
    /* Derived state for internal purposes:
     */
-   struct radeon_stipple_state stipple;
    struct r200_texture_state texture;
    GLuint envneeded;
 };
index af60861bbb80a0c9cb77c43453930ead59eaafb8..ab1ba1f283a85279aee730f93de8c02d5d2ee75d 100644 (file)
@@ -2468,7 +2468,7 @@ static void r200WrapRunPipeline( GLcontext *ctx )
 
 /* Initialize the driver's state functions.
  */
-void r200InitStateFuncs( struct dd_function_table *functions )
+void r200InitStateFuncs( struct dd_function_table *functions, GLboolean dri2 )
 {
    functions->UpdateState              = r200InvalidateState;
    functions->LightingSpaceChange      = r200LightingSpaceChange;
@@ -2502,7 +2502,10 @@ void r200InitStateFuncs( struct dd_function_table *functions )
    functions->LogicOpcode              = r200LogicOpCode;
    functions->PolygonMode              = r200PolygonMode;
    functions->PolygonOffset            = r200PolygonOffset;
-   functions->PolygonStipple           = radeonPolygonStipple;
+   if (dri2)
+      functions->PolygonStipple                = radeonPolygonStipple;
+   else
+      functions->PolygonStipple                = radeonPolygonStipplePreKMS;
    functions->PointParameterfv         = r200PointParameter;
    functions->PointSize                        = r200PointSize;
    functions->RenderMode               = r200RenderMode;
index 7b9b0c106aa10876d0574bc82fc9a9b928186c0f..9c62f0a644682d9281b966eed276aed9dc326605 100644 (file)
@@ -38,7 +38,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r200_context.h"
 
 extern void r200InitState( r200ContextPtr rmesa );
-extern void r200InitStateFuncs( struct dd_function_table *functions );
+extern void r200InitStateFuncs( struct dd_function_table *functions, GLboolean dri2 );
 extern void r200InitTnlFuncs( GLcontext *ctx );
 
 extern void r200UpdateMaterial( GLcontext *ctx );
index e760279d4a5e2230b2e1e50558131c18efd66ec0..e14a419045387d9e123cf94c3f7e12c6e8c2b883 100644 (file)
@@ -273,6 +273,28 @@ void radeonScissor(GLcontext* ctx, GLint x, GLint y, GLsizei w, GLsizei h)
        }
 }
 
+void radeonPolygonStipplePreKMS( GLcontext *ctx, const GLubyte *mask )
+{
+   radeonContextPtr radeon = RADEON_CONTEXT(ctx);
+   GLuint i;
+   drm_radeon_stipple_t stipple;
+
+   /* Must flip pattern upside down.
+   */
+   for ( i = 0 ; i < 32 ; i++ ) {
+      stipple.mask[31 - i] = ((GLuint *) mask)[i];
+   }
+
+   /* TODO: push this into cmd mechanism
+   */
+   radeon_firevertices(radeon);
+   LOCK_HARDWARE( radeon );
+
+   drmCommandWrite( radeon->dri.fd, DRM_RADEON_STIPPLE,
+        &stipple, sizeof(stipple) );
+   UNLOCK_HARDWARE( radeon );
+}
+
 void radeonPolygonStipple( GLcontext *ctx, const GLubyte *mask )
 {
    radeonContextPtr radeon = RADEON_CONTEXT(ctx);
index e2a65f46f60e92312a52071f13f55c91add1ba41..ba983e5ab6c7c3a6242376c1f46eba87c3b3cc24 100644 (file)
@@ -11,6 +11,7 @@ void radeonSetCliprects(radeonContextPtr radeon);
 void radeonUpdateScissor( GLcontext *ctx );
 void radeonScissor(GLcontext* ctx, GLint x, GLint y, GLsizei w, GLsizei h);
 void radeonPolygonStipple( GLcontext *ctx, const GLubyte *mask );
+void radeonPolygonStipplePreKMS( GLcontext *ctx, const GLubyte *mask );
 
 void radeonWaitForIdleLocked(radeonContextPtr radeon);
 extern uint32_t radeonGetAge(radeonContextPtr radeon);
index 427eb946ffa8316d0754567f3d33f3efb1aec55b..3463b4d264e77044737305f08a38020d5865a593 100644 (file)
@@ -158,10 +158,6 @@ struct radeon_stencilbuffer_state {
        GLuint clear;           /* rb3d_stencilrefmask value */
 };
 
-struct radeon_stipple_state {
-       GLuint mask[32];
-};
-
 struct radeon_state_atom {
        struct radeon_state_atom *next, *prev;
        const char *name;       /* for debug */
index cbe3416726d0bd45505f6c6e20f2e2633b2ac0cf..32485a727023c57b8afc110045859e5a0fc13b93 100644 (file)
@@ -395,7 +395,7 @@ r100CreateContext( const __GLcontextModes *glVisual,
    radeon_fbo_init(&rmesa->radeon);
    radeonInitSpanFuncs( ctx );
    radeonInitIoctlFuncs( ctx );
-   radeonInitStateFuncs( ctx );
+   radeonInitStateFuncs( ctx , rmesa->radeon.radeonScreen->kernel_mm );
    radeonInitState( rmesa );
    radeonInitSwtcl( ctx );
 
index 0845cad519fcd52a798ba6ce2f5e804dea73e835..572acbb0069b8a045cc12511a02aecf9b43b1caf 100644 (file)
@@ -328,7 +328,6 @@ struct r100_hw_state {
 
 
 struct r100_state {
-       struct radeon_stipple_state stipple;
        struct radeon_texture_state texture;
 };
 
index 9d877cb751ea5f9a5694a6377f359ea6c926cd74..e03551d666467ba0b491420c29cb49a778a55e63 100644 (file)
@@ -2202,7 +2202,7 @@ static void radeonWrapRunPipeline( GLcontext *ctx )
  * Many of the ctx->Driver functions might have been initialized to
  * software defaults in the earlier _mesa_init_driver_functions() call.
  */
-void radeonInitStateFuncs( GLcontext *ctx )
+void radeonInitStateFuncs( GLcontext *ctx , GLboolean dri2 )
 {
    ctx->Driver.UpdateState             = radeonInvalidateState;
    ctx->Driver.LightingSpaceChange      = radeonLightingSpaceChange;
@@ -2235,7 +2235,10 @@ void radeonInitStateFuncs( GLcontext *ctx )
    ctx->Driver.LogicOpcode             = radeonLogicOpCode;
    ctx->Driver.PolygonMode             = radeonPolygonMode;
    ctx->Driver.PolygonOffset           = radeonPolygonOffset;
-   ctx->Driver.PolygonStipple          = radeonPolygonStipple;
+   if (dri2)
+      ctx->Driver.PolygonStipple               = radeonPolygonStipple;
+   else
+      ctx->Driver.PolygonStipple               = radeonPolygonStipplePreKMS;
    ctx->Driver.RenderMode              = radeonRenderMode;
    ctx->Driver.Scissor                 = radeonScissor;
    ctx->Driver.ShadeModel              = radeonShadeModel;
index a7c8eef32a54697fb2ba1e35ab3833960b369d00..c780cff0cfb2f3dd9ae87fb738f727abb16615a1 100644 (file)
@@ -40,7 +40,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "radeon_context.h"
 
 extern void radeonInitState( r100ContextPtr rmesa );
-extern void radeonInitStateFuncs( GLcontext *ctx );
+extern void radeonInitStateFuncs( GLcontext *ctx , GLboolean dri2);
 
 extern void radeonUpdateMaterial( GLcontext *ctx );