r500: fragment program upload is also used to upload constants.
authorDave Airlie <airlied@redhat.com>
Fri, 21 Mar 2008 06:59:52 +0000 (16:59 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 21 Mar 2008 06:59:52 +0000 (16:59 +1000)
Limit frag address to 8 bits

shared-core/r300_cmdbuf.c
shared-core/radeon_drm.h

index 040a363..1ae2e67 100644 (file)
@@ -804,26 +804,38 @@ static __inline__ int r300_emit_r500fp(drm_radeon_private_t *dev_priv,
 {
        int sz;
        int addr;
+       int type;
+       int clamp;
+       int stride;
        RING_LOCALS;
 
        sz = header.r500fp.count;
-       addr = (header.r500fp.adrhi << 8) | header.r500fp.adrlo;
+       /* address is 9 bits 0 - 8, bit 1 of flags is part of address */
+       addr = ((header.r500fp.adrhi_flags & 1) << 8) | header.r500fp.adrlo;
 
-       DRM_DEBUG("r500fp %d %d\n", sz, addr);
+       type = !!(header.r500fp.adrhi_flags & R500FP_CONSTANT_TYPE);
+       clamp = !!(header.r500fp.adrhi_flags & R500FP_CONSTANT_CLAMP);
+
+       addr |= (type << 16);
+       addr |= (clamp << 17);
+
+       stride = type ? 4 : 6;
+
+       DRM_DEBUG("r500fp %d %d type: %d\n", sz, addr, type);
        if (!sz)
                return 0;
-       if (sz * 6 * 4 > cmdbuf->bufsz)
+       if (sz * stride * 4 > cmdbuf->bufsz)
                return -EINVAL;
 
-       BEGIN_RING(3 + sz * 6);
+       BEGIN_RING(3 + sz * stride);
        OUT_RING_REG(R500_GA_US_VECTOR_INDEX, addr);
-       OUT_RING(CP_PACKET0_TABLE(R500_GA_US_VECTOR_DATA, sz * 6 - 1));
-       OUT_RING_TABLE((int *)cmdbuf->buf, sz * 6);
+       OUT_RING(CP_PACKET0_TABLE(R500_GA_US_VECTOR_DATA, sz * stride - 1));
+       OUT_RING_TABLE((int *)cmdbuf->buf, sz * stride);
 
        ADVANCE_RING();
 
-       cmdbuf->buf += sz * 6 * 4;
-       cmdbuf->bufsz -= sz * 6 * 4;
+       cmdbuf->buf += sz * stride * 4;
+       cmdbuf->bufsz -= sz * stride * 4;
 
        return 0;
 }
index 3437320..c4d9cc6 100644 (file)
@@ -258,7 +258,7 @@ typedef union {
                unsigned char cmd_type, reg, n_bufs, flags;
        } scratch;
        struct {
-               unsigned char cmd_type, count, adrlo, adrhi;
+               unsigned char cmd_type, count, adrlo, adrhi_flags;
        } r500fp;
 } drm_r300_cmd_header_t;
 
@@ -270,6 +270,9 @@ typedef union {
 #define RADEON_USE_HIERZ               0x40000000
 #define RADEON_USE_COMP_ZBUF           0x20000000
 
+#define R500FP_CONSTANT_TYPE  (1 << 1)
+#define R500FP_CONSTANT_CLAMP (1 << 2)
+
 /* Primitive types
  */
 #define RADEON_POINTS                  0x1