fix missing *_STATECHANGE in *UpdateViewportOffset for radeon, r200 and r300 (reported by Jim Duchek). Fix some potential problems with strict-aliasing with r200 and radeon drivers in *UpdateViewportOffset, *PolygonOffset and *UpdateWindow functions (some compiler warnings about strict-aliasing remain in the codegen vertex code, and there may be more problems unnoticed by the compiler).
This commit is contained in:
@@ -53,6 +53,10 @@ struct r200_context;
|
||||
typedef struct r200_context r200ContextRec;
|
||||
typedef struct r200_context *r200ContextPtr;
|
||||
|
||||
/* This union is used to avoid warnings/miscompilation
|
||||
with float to uint32_t casts due to strict-aliasing */
|
||||
typedef union { GLfloat f; uint32_t ui32; } float_ui32_type;
|
||||
|
||||
#include "r200_lock.h"
|
||||
#include "radeon_screen.h"
|
||||
#include "mm.h"
|
||||
|
||||
@@ -763,9 +763,11 @@ static int print_float_reg_assignment( struct reg *reg, float data )
|
||||
|
||||
static int print_reg_assignment( struct reg *reg, int data )
|
||||
{
|
||||
float_ui32_type datau;
|
||||
datau.ui32 = data;
|
||||
reg->flags |= TOUCHED;
|
||||
if (reg->flags & ISFLOAT)
|
||||
return print_float_reg_assignment( reg, *(float *)&data );
|
||||
return print_float_reg_assignment( reg, datau.f );
|
||||
else
|
||||
return print_int_reg_assignment( reg, data );
|
||||
}
|
||||
|
||||
@@ -762,16 +762,17 @@ static void r200PolygonOffset( GLcontext *ctx,
|
||||
GLfloat factor, GLfloat units )
|
||||
{
|
||||
r200ContextPtr rmesa = R200_CONTEXT(ctx);
|
||||
GLfloat constant = units * rmesa->state.depth.scale;
|
||||
float_ui32_type constant = { units * rmesa->state.depth.scale };
|
||||
float_ui32_type factoru = { factor };
|
||||
|
||||
/* factor *= 2; */
|
||||
/* constant *= 2; */
|
||||
|
||||
|
||||
/* fprintf(stderr, "%s f:%f u:%f\n", __FUNCTION__, factor, constant); */
|
||||
|
||||
R200_STATECHANGE( rmesa, zbs );
|
||||
rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR] = *(GLuint *)&factor;
|
||||
rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = *(GLuint *)&constant;
|
||||
rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR] = factoru.ui32;
|
||||
rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = constant.ui32;
|
||||
}
|
||||
|
||||
static void r200PolygonStipple( GLcontext *ctx, const GLubyte *mask )
|
||||
@@ -1624,22 +1625,22 @@ void r200UpdateWindow( GLcontext *ctx )
|
||||
GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h;
|
||||
const GLfloat *v = ctx->Viewport._WindowMap.m;
|
||||
|
||||
GLfloat sx = v[MAT_SX];
|
||||
GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
|
||||
GLfloat sy = - v[MAT_SY];
|
||||
GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
|
||||
GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale;
|
||||
GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale;
|
||||
float_ui32_type sx = { v[MAT_SX] };
|
||||
float_ui32_type tx = { v[MAT_TX] + xoffset + SUBPIXEL_X };
|
||||
float_ui32_type sy = { - v[MAT_SY] };
|
||||
float_ui32_type ty = { (- v[MAT_TY]) + yoffset + SUBPIXEL_Y };
|
||||
float_ui32_type sz = { v[MAT_SZ] * rmesa->state.depth.scale };
|
||||
float_ui32_type tz = { v[MAT_TZ] * rmesa->state.depth.scale };
|
||||
|
||||
R200_FIREVERTICES( rmesa );
|
||||
R200_STATECHANGE( rmesa, vpt );
|
||||
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = *(GLuint *)&sx;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = *(GLuint *)&sy;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = *(GLuint *)&sz;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = *(GLuint *)&tz;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = sx.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = sy.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = sz.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = tz.ui32;
|
||||
}
|
||||
|
||||
|
||||
@@ -1668,18 +1669,22 @@ void r200UpdateViewportOffset( GLcontext *ctx )
|
||||
GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h;
|
||||
const GLfloat *v = ctx->Viewport._WindowMap.m;
|
||||
|
||||
GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
|
||||
GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
|
||||
float_ui32_type tx;
|
||||
float_ui32_type ty;
|
||||
|
||||
if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != *(GLuint *)&tx ||
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != *(GLuint *)&ty )
|
||||
tx.f = v[MAT_TX] + xoffset + SUBPIXEL_X;
|
||||
ty.f = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
|
||||
|
||||
if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != tx.ui32 ||
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != ty.ui32 )
|
||||
{
|
||||
/* Note: this should also modify whatever data the context reset
|
||||
* code uses...
|
||||
*/
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty;
|
||||
|
||||
R200_STATECHANGE( rmesa, vpt );
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
|
||||
|
||||
/* update polygon stipple x/y screen offset */
|
||||
{
|
||||
GLuint stx, sty;
|
||||
|
||||
@@ -880,6 +880,7 @@ void r300UpdateViewportOffset( GLcontext *ctx )
|
||||
/* Note: this should also modify whatever data the context reset
|
||||
* code uses...
|
||||
*/
|
||||
R300_STATECHANGE( rmesa, vpt );
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = r300PackFloat32(tx);
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = r300PackFloat32(ty);
|
||||
|
||||
|
||||
@@ -52,6 +52,10 @@ struct radeon_context;
|
||||
typedef struct radeon_context radeonContextRec;
|
||||
typedef struct radeon_context *radeonContextPtr;
|
||||
|
||||
/* This union is used to avoid warnings/miscompilation
|
||||
with float to uint32_t casts due to strict-aliasing */
|
||||
typedef union { GLfloat f; uint32_t ui32; } float_ui32_type;
|
||||
|
||||
#include "radeon_lock.h"
|
||||
#include "radeon_screen.h"
|
||||
#include "mm.h"
|
||||
|
||||
@@ -487,9 +487,11 @@ static int print_float_reg_assignment( struct reg *reg, float data )
|
||||
|
||||
static int print_reg_assignment( struct reg *reg, int data )
|
||||
{
|
||||
float_ui32_type datau;
|
||||
datau.ui32 = data;
|
||||
reg->flags |= TOUCHED;
|
||||
if (reg->flags & ISFLOAT)
|
||||
return print_float_reg_assignment( reg, *(float *)&data );
|
||||
return print_float_reg_assignment( reg, datau.f );
|
||||
else
|
||||
return print_int_reg_assignment( reg, data );
|
||||
}
|
||||
|
||||
@@ -624,11 +624,12 @@ static void radeonPolygonOffset( GLcontext *ctx,
|
||||
GLfloat factor, GLfloat units )
|
||||
{
|
||||
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
|
||||
GLfloat constant = units * rmesa->state.depth.scale;
|
||||
float_ui32_type constant = { units * rmesa->state.depth.scale };
|
||||
float_ui32_type factoru = { factor };
|
||||
|
||||
RADEON_STATECHANGE( rmesa, zbs );
|
||||
rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR] = *(GLuint *)&factor;
|
||||
rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = *(GLuint *)&constant;
|
||||
rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_FACTOR] = factoru.ui32;
|
||||
rmesa->hw.zbs.cmd[ZBS_SE_ZBIAS_CONSTANT] = constant.ui32;
|
||||
}
|
||||
|
||||
static void radeonPolygonStipple( GLcontext *ctx, const GLubyte *mask )
|
||||
@@ -1486,21 +1487,22 @@ void radeonUpdateWindow( GLcontext *ctx )
|
||||
GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h;
|
||||
const GLfloat *v = ctx->Viewport._WindowMap.m;
|
||||
|
||||
GLfloat sx = v[MAT_SX];
|
||||
GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
|
||||
GLfloat sy = - v[MAT_SY];
|
||||
GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
|
||||
GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale;
|
||||
GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale;
|
||||
float_ui32_type sx = { v[MAT_SX] };
|
||||
float_ui32_type tx = { v[MAT_TX] + xoffset + SUBPIXEL_X };
|
||||
float_ui32_type sy = { - v[MAT_SY] };
|
||||
float_ui32_type ty = { (- v[MAT_TY]) + yoffset + SUBPIXEL_Y };
|
||||
float_ui32_type sz = { v[MAT_SZ] * rmesa->state.depth.scale };
|
||||
float_ui32_type tz = { v[MAT_TZ] * rmesa->state.depth.scale };
|
||||
|
||||
RADEON_FIREVERTICES( rmesa );
|
||||
RADEON_STATECHANGE( rmesa, vpt );
|
||||
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = *(GLuint *)&sx;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = *(GLuint *)&sy;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = *(GLuint *)&sz;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = *(GLuint *)&tz;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = sx.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = sy.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = sz.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = tz.ui32;
|
||||
}
|
||||
|
||||
|
||||
@@ -1528,18 +1530,22 @@ void radeonUpdateViewportOffset( GLcontext *ctx )
|
||||
GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h;
|
||||
const GLfloat *v = ctx->Viewport._WindowMap.m;
|
||||
|
||||
GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
|
||||
GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
|
||||
float_ui32_type tx;
|
||||
float_ui32_type ty;
|
||||
|
||||
if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != *(GLuint *)&tx ||
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != *(GLuint *)&ty )
|
||||
tx.f = v[MAT_TX] + xoffset + SUBPIXEL_X;
|
||||
ty.f = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
|
||||
|
||||
if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != tx.ui32 ||
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != ty.ui32 )
|
||||
{
|
||||
/* Note: this should also modify whatever data the context reset
|
||||
* code uses...
|
||||
*/
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = *(GLuint *)&tx;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = *(GLuint *)&ty;
|
||||
|
||||
RADEON_STATECHANGE( rmesa, vpt );
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = tx.ui32;
|
||||
rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = ty.ui32;
|
||||
|
||||
/* update polygon stipple x/y screen offset */
|
||||
{
|
||||
GLuint stx, sty;
|
||||
|
||||
Reference in New Issue
Block a user