diff options
author | Dave Airlie | 2008-03-21 01:59:52 -0500 |
---|---|---|
committer | Dave Airlie | 2008-03-21 01:59:52 -0500 |
commit | 36e11dd3801734ff5af9f5edb7aa698f0e2c49c2 (patch) | |
tree | f7a9124c0d5b37b29bbc6e1e680728f284d0d1f6 /shared-core | |
parent | 316979356f05796c5bd5a47dfc29fe48d6874b49 (diff) | |
download | external-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.c | 28 | ||||
-rw-r--r-- | shared-core/radeon_drm.h | 5 |
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 |