aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie2008-03-21 01:59:52 -0500
committerDave Airlie2008-03-21 01:59:52 -0500
commit36e11dd3801734ff5af9f5edb7aa698f0e2c49c2 (patch)
treef7a9124c0d5b37b29bbc6e1e680728f284d0d1f6 /shared-core
parent316979356f05796c5bd5a47dfc29fe48d6874b49 (diff)
downloadexternal-libdrm-36e11dd3801734ff5af9f5edb7aa698f0e2c49c2.tar.gz
external-libdrm-36e11dd3801734ff5af9f5edb7aa698f0e2c49c2.tar.xz
external-libdrm-36e11dd3801734ff5af9f5edb7aa698f0e2c49c2.zip
r500: fragment program upload is also used to upload constants.
Limit frag address to 8 bits
Diffstat (limited to 'shared-core')
-rw-r--r--shared-core/r300_cmdbuf.c28
-rw-r--r--shared-core/radeon_drm.h5
2 files changed, 24 insertions, 9 deletions
diff --git a/shared-core/r300_cmdbuf.c b/shared-core/r300_cmdbuf.c
index 040a3639..1ae2e677 100644
--- a/shared-core/r300_cmdbuf.c
+++ b/shared-core/r300_cmdbuf.c
@@ -804,26 +804,38 @@ static __inline__ int r300_emit_r500fp(drm_radeon_private_t *dev_priv,
804{ 804{
805 int sz; 805 int sz;
806 int addr; 806 int addr;
807 int type;
808 int clamp;
809 int stride;
807 RING_LOCALS; 810 RING_LOCALS;
808 811
809 sz = header.r500fp.count; 812 sz = header.r500fp.count;
810 addr = (header.r500fp.adrhi << 8) | header.r500fp.adrlo; 813 /* address is 9 bits 0 - 8, bit 1 of flags is part of address */
814 addr = ((header.r500fp.adrhi_flags & 1) << 8) | header.r500fp.adrlo;
811 815
812 DRM_DEBUG("r500fp %d %d\n", sz, addr); 816 type = !!(header.r500fp.adrhi_flags & R500FP_CONSTANT_TYPE);
817 clamp = !!(header.r500fp.adrhi_flags & R500FP_CONSTANT_CLAMP);
818
819 addr |= (type << 16);
820 addr |= (clamp << 17);
821
822 stride = type ? 4 : 6;
823
824 DRM_DEBUG("r500fp %d %d type: %d\n", sz, addr, type);
813 if (!sz) 825 if (!sz)
814 return 0; 826 return 0;
815 if (sz * 6 * 4 > cmdbuf->bufsz) 827 if (sz * stride * 4 > cmdbuf->bufsz)
816 return -EINVAL; 828 return -EINVAL;
817 829
818 BEGIN_RING(3 + sz * 6); 830 BEGIN_RING(3 + sz * stride);
819 OUT_RING_REG(R500_GA_US_VECTOR_INDEX, addr); 831 OUT_RING_REG(R500_GA_US_VECTOR_INDEX, addr);
820 OUT_RING(CP_PACKET0_TABLE(R500_GA_US_VECTOR_DATA, sz * 6 - 1)); 832 OUT_RING(CP_PACKET0_TABLE(R500_GA_US_VECTOR_DATA, sz * stride - 1));
821 OUT_RING_TABLE((int *)cmdbuf->buf, sz * 6); 833 OUT_RING_TABLE((int *)cmdbuf->buf, sz * stride);
822 834
823 ADVANCE_RING(); 835 ADVANCE_RING();
824 836
825 cmdbuf->buf += sz * 6 * 4; 837 cmdbuf->buf += sz * stride * 4;
826 cmdbuf->bufsz -= sz * 6 * 4; 838 cmdbuf->bufsz -= sz * stride * 4;
827 839
828 return 0; 840 return 0;
829} 841}
diff --git a/shared-core/radeon_drm.h b/shared-core/radeon_drm.h
index 3437320f..c4d9cc6b 100644
--- a/shared-core/radeon_drm.h
+++ b/shared-core/radeon_drm.h
@@ -258,7 +258,7 @@ typedef union {
258 unsigned char cmd_type, reg, n_bufs, flags; 258 unsigned char cmd_type, reg, n_bufs, flags;
259 } scratch; 259 } scratch;
260 struct { 260 struct {
261 unsigned char cmd_type, count, adrlo, adrhi; 261 unsigned char cmd_type, count, adrlo, adrhi_flags;
262 } r500fp; 262 } r500fp;
263} drm_r300_cmd_header_t; 263} drm_r300_cmd_header_t;
264 264
@@ -270,6 +270,9 @@ typedef union {
270#define RADEON_USE_HIERZ 0x40000000 270#define RADEON_USE_HIERZ 0x40000000
271#define RADEON_USE_COMP_ZBUF 0x20000000 271#define RADEON_USE_COMP_ZBUF 0x20000000
272 272
273#define R500FP_CONSTANT_TYPE (1 << 1)
274#define R500FP_CONSTANT_CLAMP (1 << 2)
275
273/* Primitive types 276/* Primitive types
274 */ 277 */
275#define RADEON_POINTS 0x1 278#define RADEON_POINTS 0x1