diff options
author | Dave Airlie <airlied@linux.ie> | 2009-09-25 00:23:47 -0400 |
---|---|---|
committer | Dave Airlie <airlied@linux.ie> | 2009-09-25 00:23:47 -0400 |
commit | adea4796cfb9b74d340f9e32ba523fb61305d0b7 (patch) | |
tree | 7cd02110a866031d70ca38037325b1d63d0348f1 /drivers | |
parent | 31edd4824ec42e7cba26498fbd35df6c66b098ba (diff) |
drm/r600: get values from the passed in IB not the copy.
this avoids reading back the IB on AGP, also it avoids
the race where since we haven't fetched the page from the main IB
and written it to the gpu one, reading back fetches 0.
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/radeon/r600_cs.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index c629b5aa4a3f..dd009da0e7a0 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
@@ -220,9 +220,11 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
220 | unsigned i; | 220 | unsigned i; |
221 | unsigned start_reg, end_reg, reg; | 221 | unsigned start_reg, end_reg, reg; |
222 | int r; | 222 | int r; |
223 | u32 idx_value; | ||
223 | 224 | ||
224 | ib = p->ib->ptr; | 225 | ib = p->ib->ptr; |
225 | idx = pkt->idx + 1; | 226 | idx = pkt->idx + 1; |
227 | idx_value = radeon_get_ib_value(p, idx); | ||
226 | 228 | ||
227 | switch (pkt->opcode) { | 229 | switch (pkt->opcode) { |
228 | case PACKET3_START_3D_CMDBUF: | 230 | case PACKET3_START_3D_CMDBUF: |
@@ -254,7 +256,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
254 | DRM_ERROR("bad DRAW_INDEX\n"); | 256 | DRM_ERROR("bad DRAW_INDEX\n"); |
255 | return -EINVAL; | 257 | return -EINVAL; |
256 | } | 258 | } |
257 | ib[idx+0] += (u32)(reloc->lobj.gpu_offset & 0xffffffff); | 259 | ib[idx+0] = idx_value + (u32)(reloc->lobj.gpu_offset & 0xffffffff); |
258 | ib[idx+1] = upper_32_bits(reloc->lobj.gpu_offset) & 0xff; | 260 | ib[idx+1] = upper_32_bits(reloc->lobj.gpu_offset) & 0xff; |
259 | break; | 261 | break; |
260 | case PACKET3_DRAW_INDEX_AUTO: | 262 | case PACKET3_DRAW_INDEX_AUTO: |
@@ -276,7 +278,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
276 | return -EINVAL; | 278 | return -EINVAL; |
277 | } | 279 | } |
278 | /* bit 4 is reg (0) or mem (1) */ | 280 | /* bit 4 is reg (0) or mem (1) */ |
279 | if (radeon_get_ib_value(p, idx) & 0x10) { | 281 | if (idx_value & 0x10) { |
280 | r = r600_cs_packet_next_reloc(p, &reloc); | 282 | r = r600_cs_packet_next_reloc(p, &reloc); |
281 | if (r) { | 283 | if (r) { |
282 | DRM_ERROR("bad WAIT_REG_MEM\n"); | 284 | DRM_ERROR("bad WAIT_REG_MEM\n"); |
@@ -331,7 +333,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
331 | ib[idx+2] |= upper_32_bits(reloc->lobj.gpu_offset) & 0xff; | 333 | ib[idx+2] |= upper_32_bits(reloc->lobj.gpu_offset) & 0xff; |
332 | break; | 334 | break; |
333 | case PACKET3_SET_CONFIG_REG: | 335 | case PACKET3_SET_CONFIG_REG: |
334 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_CONFIG_REG_OFFSET; | 336 | start_reg = (idx_value << 2) + PACKET3_SET_CONFIG_REG_OFFSET; |
335 | end_reg = 4 * pkt->count + start_reg - 4; | 337 | end_reg = 4 * pkt->count + start_reg - 4; |
336 | if ((start_reg < PACKET3_SET_CONFIG_REG_OFFSET) || | 338 | if ((start_reg < PACKET3_SET_CONFIG_REG_OFFSET) || |
337 | (start_reg >= PACKET3_SET_CONFIG_REG_END) || | 339 | (start_reg >= PACKET3_SET_CONFIG_REG_END) || |
@@ -351,7 +353,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
351 | } | 353 | } |
352 | break; | 354 | break; |
353 | case PACKET3_SET_CONTEXT_REG: | 355 | case PACKET3_SET_CONTEXT_REG: |
354 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_CONTEXT_REG_OFFSET; | 356 | start_reg = (idx_value << 2) + PACKET3_SET_CONTEXT_REG_OFFSET; |
355 | end_reg = 4 * pkt->count + start_reg - 4; | 357 | end_reg = 4 * pkt->count + start_reg - 4; |
356 | if ((start_reg < PACKET3_SET_CONTEXT_REG_OFFSET) || | 358 | if ((start_reg < PACKET3_SET_CONTEXT_REG_OFFSET) || |
357 | (start_reg >= PACKET3_SET_CONTEXT_REG_END) || | 359 | (start_reg >= PACKET3_SET_CONTEXT_REG_END) || |
@@ -416,7 +418,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
416 | DRM_ERROR("bad SET_RESOURCE\n"); | 418 | DRM_ERROR("bad SET_RESOURCE\n"); |
417 | return -EINVAL; | 419 | return -EINVAL; |
418 | } | 420 | } |
419 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_RESOURCE_OFFSET; | 421 | start_reg = (idx_value << 2) + PACKET3_SET_RESOURCE_OFFSET; |
420 | end_reg = 4 * pkt->count + start_reg - 4; | 422 | end_reg = 4 * pkt->count + start_reg - 4; |
421 | if ((start_reg < PACKET3_SET_RESOURCE_OFFSET) || | 423 | if ((start_reg < PACKET3_SET_RESOURCE_OFFSET) || |
422 | (start_reg >= PACKET3_SET_RESOURCE_END) || | 424 | (start_reg >= PACKET3_SET_RESOURCE_END) || |
@@ -425,7 +427,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
425 | return -EINVAL; | 427 | return -EINVAL; |
426 | } | 428 | } |
427 | for (i = 0; i < (pkt->count / 7); i++) { | 429 | for (i = 0; i < (pkt->count / 7); i++) { |
428 | switch (G__SQ_VTX_CONSTANT_TYPE(ib[idx+(i*7)+6+1])) { | 430 | switch (G__SQ_VTX_CONSTANT_TYPE(radeon_get_ib_value(p, idx+(i*7)+6+1))) { |
429 | case SQ_TEX_VTX_VALID_TEXTURE: | 431 | case SQ_TEX_VTX_VALID_TEXTURE: |
430 | /* tex base */ | 432 | /* tex base */ |
431 | r = r600_cs_packet_next_reloc(p, &reloc); | 433 | r = r600_cs_packet_next_reloc(p, &reloc); |
@@ -461,7 +463,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
461 | } | 463 | } |
462 | break; | 464 | break; |
463 | case PACKET3_SET_ALU_CONST: | 465 | case PACKET3_SET_ALU_CONST: |
464 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_ALU_CONST_OFFSET; | 466 | start_reg = (idx_value << 2) + PACKET3_SET_ALU_CONST_OFFSET; |
465 | end_reg = 4 * pkt->count + start_reg - 4; | 467 | end_reg = 4 * pkt->count + start_reg - 4; |
466 | if ((start_reg < PACKET3_SET_ALU_CONST_OFFSET) || | 468 | if ((start_reg < PACKET3_SET_ALU_CONST_OFFSET) || |
467 | (start_reg >= PACKET3_SET_ALU_CONST_END) || | 469 | (start_reg >= PACKET3_SET_ALU_CONST_END) || |
@@ -471,7 +473,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
471 | } | 473 | } |
472 | break; | 474 | break; |
473 | case PACKET3_SET_BOOL_CONST: | 475 | case PACKET3_SET_BOOL_CONST: |
474 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_BOOL_CONST_OFFSET; | 476 | start_reg = (idx_value << 2) + PACKET3_SET_BOOL_CONST_OFFSET; |
475 | end_reg = 4 * pkt->count + start_reg - 4; | 477 | end_reg = 4 * pkt->count + start_reg - 4; |
476 | if ((start_reg < PACKET3_SET_BOOL_CONST_OFFSET) || | 478 | if ((start_reg < PACKET3_SET_BOOL_CONST_OFFSET) || |
477 | (start_reg >= PACKET3_SET_BOOL_CONST_END) || | 479 | (start_reg >= PACKET3_SET_BOOL_CONST_END) || |
@@ -481,7 +483,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
481 | } | 483 | } |
482 | break; | 484 | break; |
483 | case PACKET3_SET_LOOP_CONST: | 485 | case PACKET3_SET_LOOP_CONST: |
484 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_LOOP_CONST_OFFSET; | 486 | start_reg = (idx_value << 2) + PACKET3_SET_LOOP_CONST_OFFSET; |
485 | end_reg = 4 * pkt->count + start_reg - 4; | 487 | end_reg = 4 * pkt->count + start_reg - 4; |
486 | if ((start_reg < PACKET3_SET_LOOP_CONST_OFFSET) || | 488 | if ((start_reg < PACKET3_SET_LOOP_CONST_OFFSET) || |
487 | (start_reg >= PACKET3_SET_LOOP_CONST_END) || | 489 | (start_reg >= PACKET3_SET_LOOP_CONST_END) || |
@@ -491,7 +493,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
491 | } | 493 | } |
492 | break; | 494 | break; |
493 | case PACKET3_SET_CTL_CONST: | 495 | case PACKET3_SET_CTL_CONST: |
494 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_CTL_CONST_OFFSET; | 496 | start_reg = (idx_value << 2) + PACKET3_SET_CTL_CONST_OFFSET; |
495 | end_reg = 4 * pkt->count + start_reg - 4; | 497 | end_reg = 4 * pkt->count + start_reg - 4; |
496 | if ((start_reg < PACKET3_SET_CTL_CONST_OFFSET) || | 498 | if ((start_reg < PACKET3_SET_CTL_CONST_OFFSET) || |
497 | (start_reg >= PACKET3_SET_CTL_CONST_END) || | 499 | (start_reg >= PACKET3_SET_CTL_CONST_END) || |
@@ -505,7 +507,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
505 | DRM_ERROR("bad SET_SAMPLER\n"); | 507 | DRM_ERROR("bad SET_SAMPLER\n"); |
506 | return -EINVAL; | 508 | return -EINVAL; |
507 | } | 509 | } |
508 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_SAMPLER_OFFSET; | 510 | start_reg = (idx_value << 2) + PACKET3_SET_SAMPLER_OFFSET; |
509 | end_reg = 4 * pkt->count + start_reg - 4; | 511 | end_reg = 4 * pkt->count + start_reg - 4; |
510 | if ((start_reg < PACKET3_SET_SAMPLER_OFFSET) || | 512 | if ((start_reg < PACKET3_SET_SAMPLER_OFFSET) || |
511 | (start_reg >= PACKET3_SET_SAMPLER_END) || | 513 | (start_reg >= PACKET3_SET_SAMPLER_END) || |