# 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
# 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.
# 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
# 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 */
}
+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.
*
(void)mode;
r300UpdateCulling(ctx);
+ r300UpdatePolygonMode(ctx);
}
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);
}
/* =============================================================