mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-25 12:20:17 +01:00
Polygon mode fixes.
This commit is contained in:
parent
bd565e4bb7
commit
e53fc72f67
3 changed files with 81 additions and 120 deletions
|
|
@ -430,12 +430,17 @@ I am fairly certain that they are correct unless stated otherwise in comments.
|
|||
# define R300_POINTSIZE_MAX (R300_POINTSIZE_Y_MASK / 6)
|
||||
|
||||
/* The line width is given in multiples of 6.
|
||||
R300_LINE_CNT_UNK1 must be on to obtain expected results. */
|
||||
In default mode lines are classified as vertical lines.
|
||||
HO: horizontal
|
||||
VE: vertical or horizontal
|
||||
HO & VE: no classification
|
||||
*/
|
||||
#define R300_RE_LINE_CNT 0x4234
|
||||
# define R300_LINESIZE_SHIFT 0
|
||||
# define R300_LINESIZE_MASK (0xFFFF << 0) /* GUESS */
|
||||
# define R300_LINESIZE_MAX (R300_LINESIZE_MASK / 6)
|
||||
# define R300_LINE_CNT_UNK1 (1 << 17)
|
||||
# define R300_LINE_CNT_HO (1 << 16)
|
||||
# define R300_LINE_CNT_VE (1 << 17)
|
||||
|
||||
/* Linestipple factor. 3a088889 == 1.0, 3baaaaa9 == 10.0 */
|
||||
#define R300_RE_LINE_STIPPLE_FACTOR 0x4238
|
||||
|
|
@ -444,8 +449,15 @@ I am fairly certain that they are correct unless stated otherwise in comments.
|
|||
# define R300_RE_SHADE_MODEL_SMOOTH 0x3aaaa
|
||||
# define R300_RE_SHADE_MODEL_FLAT 0x39595
|
||||
|
||||
|
||||
/* Dangerous */
|
||||
#define R300_RE_POLYGON_MODE 0x4288
|
||||
# define R300_PM_ENABLED (1 << 0)
|
||||
# define R300_PM_FRONT_POINT (0 << 0)
|
||||
# define R300_PM_BACK_POINT (0 << 0)
|
||||
# define R300_PM_FRONT_LINE (1 << 4)
|
||||
# define R300_PM_FRONT_FILL (1 << 5)
|
||||
# define R300_PM_BACK_LINE (1 << 7)
|
||||
# define R300_PM_BACK_FILL (1 << 8)
|
||||
|
||||
/* Not sure why there are duplicate of factor and constant values.
|
||||
My best guess so far is that there are seperate zbiases for test and write.
|
||||
|
|
@ -649,6 +661,7 @@ I am fairly certain that they are correct unless stated otherwise in comments.
|
|||
# define R300_TX_WIDTHMASK_MASK (2047 << 0)
|
||||
# define R300_TX_HEIGHTMASK_SHIFT 11
|
||||
# define R300_TX_HEIGHTMASK_MASK (2047 << 11)
|
||||
# define R300_TX_UNK23 (1 << 23)
|
||||
# define R300_TX_SIZE_SHIFT 26 /* largest of width, height */
|
||||
# define R300_TX_SIZE_MASK (15 << 26)
|
||||
#define R300_TX_FORMAT_0 0x44C0
|
||||
|
|
@ -679,6 +692,8 @@ I am fairly certain that they are correct unless stated otherwise in comments.
|
|||
# define R300_TX_FORMAT_B8G8_B8G8 0x14 /* no swizzle */
|
||||
# define R300_TX_FORMAT_G8R8_G8B8 0x15 /* no swizzle */
|
||||
/* 0x16 - some 16 bit green format.. ?? */
|
||||
# define R300_TX_FORMAT_UNK25 (1 << 25) /* no swizzle */
|
||||
|
||||
/* gap */
|
||||
/* Floating point formats */
|
||||
/* Note - hardware supports both 16 and 32 bit floating point */
|
||||
|
|
|
|||
|
|
@ -765,6 +765,13 @@ static GLboolean r300_run_tcl_render(GLcontext *ctx,
|
|||
vp = CURRENT_VERTEX_SHADER(ctx);
|
||||
if(vp->translated == GL_FALSE)
|
||||
translate_vertex_shader(vp);
|
||||
if(vp->translated == GL_FALSE){
|
||||
fprintf(stderr, "Failing back to sw-tcl\n");
|
||||
debug_vp(ctx, vp);
|
||||
hw_tcl_on=future_hw_tcl_on=0;
|
||||
r300ResetHwState(rmesa);
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
r300_setup_textures(ctx);
|
||||
r300_setup_rs_unit(ctx);
|
||||
|
|
|
|||
|
|
@ -514,6 +514,56 @@ static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
|
|||
}
|
||||
|
||||
|
||||
static void r300UpdatePolygonMode(GLcontext *ctx)
|
||||
{
|
||||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
uint32_t hw_mode=0;
|
||||
|
||||
if (ctx->Polygon.FrontMode != GL_FILL ||
|
||||
ctx->Polygon.BackMode != GL_FILL) {
|
||||
GLenum f, b;
|
||||
|
||||
if (ctx->Polygon.FrontFace == GL_CCW) {
|
||||
f = ctx->Polygon.FrontMode;
|
||||
b = ctx->Polygon.BackMode;
|
||||
} else {
|
||||
f = ctx->Polygon.BackMode;
|
||||
b = ctx->Polygon.FrontMode;
|
||||
}
|
||||
|
||||
hw_mode |= R300_PM_ENABLED;
|
||||
|
||||
switch (f) {
|
||||
case GL_LINE:
|
||||
hw_mode |= R300_PM_FRONT_LINE;
|
||||
break;
|
||||
case GL_POINT: /* noop */
|
||||
hw_mode |= R300_PM_FRONT_POINT;
|
||||
break;
|
||||
case GL_FILL:
|
||||
hw_mode |= R300_PM_FRONT_FILL;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (b) {
|
||||
case GL_LINE:
|
||||
hw_mode |= R300_PM_BACK_LINE;
|
||||
break;
|
||||
case GL_POINT: /* noop */
|
||||
hw_mode |= R300_PM_BACK_POINT;
|
||||
break;
|
||||
case GL_FILL:
|
||||
hw_mode |= R300_PM_BACK_FILL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (r300->hw.unk4288.cmd[1] != hw_mode) {
|
||||
R300_STATECHANGE(r300, unk4288);
|
||||
r300->hw.unk4288.cmd[1] = hw_mode;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the culling mode.
|
||||
*
|
||||
|
|
@ -537,6 +587,7 @@ static void r300FrontFace(GLcontext* ctx, GLenum mode)
|
|||
(void)mode;
|
||||
|
||||
r300UpdateCulling(ctx);
|
||||
r300UpdatePolygonMode(ctx);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -651,127 +702,15 @@ static void r300LineWidth(GLcontext *ctx, GLfloat widthf)
|
|||
|
||||
R300_STATECHANGE(r300, lcntl);
|
||||
r300->hw.lcntl.cmd[1] = (int)(widthf * 6.0);
|
||||
/* Doesnt look very good without this... */
|
||||
r300->hw.lcntl.cmd[1] |= R300_LINE_CNT_UNK1;
|
||||
r300->hw.lcntl.cmd[1] |= R300_LINE_CNT_VE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); : 00000091 ( 1001 0001)
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); : 00000001 ( 1)
|
||||
|
||||
glPolygonMode(GL_FRONT, GL_LINE); : 00000111 (1 0001 0001)
|
||||
glPolygonMode(GL_FRONT, GL_POINT); : 00000101 (1 0000 0001)
|
||||
|
||||
glPolygonMode(GL_BACK, GL_LINE); : 000000a1 ( 1010 0001)
|
||||
glPolygonMode(GL_BACK, GL_POINT); : 00000021 ( 10 0001)
|
||||
|
||||
*/
|
||||
|
||||
/* exclusive */
|
||||
#define PM_NOT_BACK (1<<8)
|
||||
#define PM_NOT_FRONT (1<<5)
|
||||
|
||||
#define PM_FRONT_LINE (1<<4)
|
||||
#define PM_BACK_LINE (1<<7)
|
||||
|
||||
static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode)
|
||||
{
|
||||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
unsigned long hw_mode=0;
|
||||
|
||||
//hw_mode=r300->hw.unk4288.cmd[1];
|
||||
hw_mode |= 1; /* enables point mode by default */
|
||||
|
||||
switch (ctx->Polygon.FrontMode) {
|
||||
case GL_LINE:
|
||||
hw_mode &= ~PM_NOT_FRONT;
|
||||
hw_mode |= PM_FRONT_LINE;
|
||||
break;
|
||||
case GL_POINT:
|
||||
hw_mode &= ~PM_NOT_FRONT;
|
||||
hw_mode &= ~PM_FRONT_LINE;
|
||||
break;
|
||||
/* I dont think fgl properly handles these... In any case, test program is needed */
|
||||
case GL_FILL:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (ctx->Polygon.BackMode) {
|
||||
case GL_LINE:
|
||||
hw_mode &= ~PM_NOT_BACK;
|
||||
hw_mode |= PM_BACK_LINE;
|
||||
break;
|
||||
case GL_POINT:
|
||||
hw_mode &= ~PM_NOT_BACK;
|
||||
hw_mode &= ~PM_BACK_LINE;
|
||||
break;
|
||||
case GL_FILL:
|
||||
break;
|
||||
}
|
||||
|
||||
if(hw_mode == 1)
|
||||
hw_mode = 0;
|
||||
|
||||
#if 0
|
||||
switch (face) {
|
||||
case GL_FRONT:
|
||||
//fprintf(stderr, "front\n");
|
||||
hw_mode &= ~PM_NOT_FRONT;
|
||||
switch (mode) {
|
||||
case GL_LINE:
|
||||
hw_mode |= PM_FRONT_LINE;
|
||||
break;
|
||||
case GL_POINT:
|
||||
hw_mode &= ~PM_FRONT_LINE;
|
||||
break;
|
||||
case GL_FILL:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_BACK:
|
||||
//fprintf(stderr, "back\n");
|
||||
hw_mode &= ~PM_NOT_BACK;
|
||||
switch (mode) {
|
||||
case GL_LINE:
|
||||
hw_mode |= PM_BACK_LINE;
|
||||
break;
|
||||
case GL_POINT:
|
||||
hw_mode &= ~PM_BACK_LINE;
|
||||
break;
|
||||
case GL_FILL:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_FRONT_AND_BACK:
|
||||
//fprintf(stderr, "front and back\n");
|
||||
hw_mode &= ~PM_NOT_FRONT;
|
||||
hw_mode &= ~PM_NOT_BACK;
|
||||
switch (mode) {
|
||||
case GL_LINE:
|
||||
hw_mode |= PM_FRONT_LINE;
|
||||
hw_mode |= PM_BACK_LINE;
|
||||
break;
|
||||
case GL_POINT:
|
||||
hw_mode &= ~PM_FRONT_LINE;
|
||||
hw_mode &= ~PM_BACK_LINE;
|
||||
break;
|
||||
case GL_FILL:
|
||||
hw_mode = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
//if( front and back fill) hw_mode=0;
|
||||
|
||||
if(r300->hw.unk4288.cmd[1] != hw_mode){
|
||||
R300_STATECHANGE(r300, unk4288);
|
||||
r300->hw.unk4288.cmd[1] = hw_mode;
|
||||
}
|
||||
(void)face;
|
||||
(void)mode;
|
||||
|
||||
r300UpdatePolygonMode(ctx);
|
||||
}
|
||||
|
||||
/* =============================================================
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue