@@ -1,6 +1,6 @@ | |||
/************************************************************************** | |||
* | |||
* Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. | |||
* Copyright 2007-2009 VMware, Inc. | |||
* All Rights Reserved. | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
@@ -18,7 +18,7 @@ | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. | |||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR | |||
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR | |||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
@@ -80,11 +80,27 @@ struct fenced_buffer_list | |||
*/ | |||
struct fenced_buffer | |||
{ | |||
/* | |||
* Immutable members. | |||
*/ | |||
struct pb_buffer base; | |||
struct pb_buffer *buffer; | |||
struct fenced_buffer_list *list; | |||
/** | |||
* Protected by fenced_buffer_list::mutex | |||
*/ | |||
struct list_head head; | |||
/* FIXME: protect access with mutex */ | |||
/** | |||
* Following members are mutable and protected by this mutex. | |||
* | |||
* You may lock this mutex alone, or lock it with fenced_buffer_list::mutex | |||
* held, but in order to prevent deadlocks you must never lock | |||
* fenced_buffer_list::mutex with this mutex held. | |||
*/ | |||
pipe_mutex mutex; | |||
/** | |||
* A bitmask of PIPE_BUFFER_USAGE_CPU/GPU_READ/WRITE describing the current | |||
@@ -96,9 +112,6 @@ struct fenced_buffer | |||
struct pb_validate *vl; | |||
unsigned validation_flags; | |||
struct pipe_fence_handle *fence; | |||
struct list_head head; | |||
struct fenced_buffer_list *list; | |||
}; | |||
@@ -110,15 +123,24 @@ fenced_buffer(struct pb_buffer *buf) | |||
} | |||
/** | |||
* Add the buffer to the fenced list. | |||
* | |||
* fenced_buffer_list::mutex and fenced_buffer::mutex must be held, in this | |||
* order before calling this function. | |||
* | |||
* Reference count should be incremented before calling this function. | |||
*/ | |||
static INLINE void | |||
_fenced_buffer_add(struct fenced_buffer *fenced_buf) | |||
fenced_buffer_add_locked(struct fenced_buffer_list *fenced_list, | |||
struct fenced_buffer *fenced_buf) | |||
{ | |||
struct fenced_buffer_list *fenced_list = fenced_buf->list; | |||
assert(pipe_is_referenced(&fenced_buf->base.base.reference)); | |||
assert(fenced_buf->flags & PIPE_BUFFER_USAGE_GPU_READ_WRITE); | |||
assert(fenced_buf->fence); | |||
/* TODO: Move the reference count increment here */ | |||
#ifdef DEBUG | |||
LIST_DEL(&fenced_buf->head); | |||
assert(fenced_list->numUnfenced); | |||
@@ -130,32 +152,16 @@ _fenced_buffer_add(struct fenced_buffer *fenced_buf) | |||
/** | |||
* Actually destroy the buffer. | |||
* Remove the buffer from the fenced list. | |||
* | |||
* fenced_buffer_list::mutex and fenced_buffer::mutex must be held, in this | |||
* order before calling this function. | |||
* | |||
* Reference count should be decremented after calling this function. | |||
*/ | |||
static INLINE void | |||
_fenced_buffer_destroy(struct fenced_buffer *fenced_buf) | |||
{ | |||
struct fenced_buffer_list *fenced_list = fenced_buf->list; | |||
assert(!pipe_is_referenced(&fenced_buf->base.base.reference)); | |||
assert(!fenced_buf->fence); | |||
#ifdef DEBUG | |||
assert(fenced_buf->head.prev); | |||
assert(fenced_buf->head.next); | |||
LIST_DEL(&fenced_buf->head); | |||
assert(fenced_list->numUnfenced); | |||
--fenced_list->numUnfenced; | |||
#else | |||
(void)fenced_list; | |||
#endif | |||
pb_reference(&fenced_buf->buffer, NULL); | |||
FREE(fenced_buf); | |||
} | |||
static INLINE void | |||
_fenced_buffer_remove(struct fenced_buffer_list *fenced_list, | |||
struct fenced_buffer *fenced_buf) | |||
fenced_buffer_remove_locked(struct fenced_buffer_list *fenced_list, | |||
struct fenced_buffer *fenced_buf) | |||
{ | |||
struct pb_fence_ops *ops = fenced_list->ops; | |||
@@ -177,37 +183,53 @@ _fenced_buffer_remove(struct fenced_buffer_list *fenced_list, | |||
++fenced_list->numUnfenced; | |||
#endif | |||
/** | |||
* FIXME!!! | |||
*/ | |||
if(!pipe_is_referenced(&fenced_buf->base.base.reference)) | |||
_fenced_buffer_destroy(fenced_buf); | |||
/* TODO: Move the reference count decrement and destruction here */ | |||
} | |||
/** | |||
* Wait for the fence to expire, and remove it from the fenced list. | |||
* | |||
* fenced_buffer::mutex must be held. fenced_buffer_list::mutex must not be | |||
* held -- it will | |||
*/ | |||
static INLINE enum pipe_error | |||
_fenced_buffer_finish(struct fenced_buffer *fenced_buf) | |||
fenced_buffer_finish_locked(struct fenced_buffer_list *fenced_list, | |||
struct fenced_buffer *fenced_buf) | |||
{ | |||
struct fenced_buffer_list *fenced_list = fenced_buf->list; | |||
struct pb_fence_ops *ops = fenced_list->ops; | |||
enum pipe_error ret = PIPE_ERROR; | |||
#if 0 | |||
debug_warning("waiting for GPU"); | |||
#endif | |||
assert(pipe_is_referenced(&fenced_buf->base.base.reference)); | |||
assert(fenced_buf->fence); | |||
/* Acquire the global lock */ | |||
pipe_mutex_unlock(fenced_buf->mutex); | |||
pipe_mutex_lock(fenced_list->mutex); | |||
pipe_mutex_lock(fenced_buf->mutex); | |||
if(fenced_buf->fence) { | |||
if(ops->fence_finish(ops, fenced_buf->fence, 0) != 0) { | |||
return PIPE_ERROR; | |||
if(ops->fence_finish(ops, fenced_buf->fence, 0) == 0) { | |||
/* Remove from the fenced list */ | |||
/* TODO: remove consequents */ | |||
fenced_buffer_remove_locked(fenced_list, fenced_buf); | |||
p_atomic_dec(&fenced_buf->base.base.reference.count); | |||
assert(pipe_is_referenced(&fenced_buf->base.base.reference)); | |||
fenced_buf->flags &= ~PIPE_BUFFER_USAGE_GPU_READ_WRITE; | |||
ret = PIPE_OK; | |||
} | |||
/* Remove from the fenced list */ | |||
/* TODO: remove consequents */ | |||
_fenced_buffer_remove(fenced_list, fenced_buf); | |||
} | |||
fenced_buf->flags &= ~PIPE_BUFFER_USAGE_GPU_READ_WRITE; | |||
return PIPE_OK; | |||
pipe_mutex_unlock(fenced_list->mutex); | |||
return ret; | |||
} | |||
@@ -215,7 +237,7 @@ _fenced_buffer_finish(struct fenced_buffer *fenced_buf) | |||
* Free as many fenced buffers from the list head as possible. | |||
*/ | |||
static void | |||
_fenced_buffer_list_check_free(struct fenced_buffer_list *fenced_list, | |||
fenced_buffer_list_check_free_locked(struct fenced_buffer_list *fenced_list, | |||
int wait) | |||
{ | |||
struct pb_fence_ops *ops = fenced_list->ops; | |||
@@ -228,21 +250,28 @@ _fenced_buffer_list_check_free(struct fenced_buffer_list *fenced_list, | |||
while(curr != &fenced_list->delayed) { | |||
fenced_buf = LIST_ENTRY(struct fenced_buffer, curr, head); | |||
pipe_mutex_lock(fenced_buf->mutex); | |||
if(fenced_buf->fence != prev_fence) { | |||
int signaled; | |||
if (wait) | |||
signaled = ops->fence_finish(ops, fenced_buf->fence, 0); | |||
else | |||
signaled = ops->fence_signalled(ops, fenced_buf->fence, 0); | |||
if (signaled != 0) | |||
if (signaled != 0) { | |||
pipe_mutex_unlock(fenced_buf->mutex); | |||
break; | |||
} | |||
prev_fence = fenced_buf->fence; | |||
} | |||
else { | |||
assert(ops->fence_signalled(ops, fenced_buf->fence, 0) == 0); | |||
} | |||
_fenced_buffer_remove(fenced_list, fenced_buf); | |||
fenced_buffer_remove_locked(fenced_list, fenced_buf); | |||
pipe_mutex_unlock(fenced_buf->mutex); | |||
pb_reference((struct pb_buffer **)&fenced_buf, NULL); | |||
curr = next; | |||
next = curr->next; | |||
@@ -256,30 +285,25 @@ fenced_buffer_destroy(struct pb_buffer *buf) | |||
struct fenced_buffer *fenced_buf = fenced_buffer(buf); | |||
struct fenced_buffer_list *fenced_list = fenced_buf->list; | |||
pipe_mutex_lock(fenced_list->mutex); | |||
assert(!pipe_is_referenced(&fenced_buf->base.base.reference)); | |||
if (fenced_buf->fence) { | |||
struct pb_fence_ops *ops = fenced_list->ops; | |||
if(ops->fence_signalled(ops, fenced_buf->fence, 0) == 0) { | |||
struct list_head *curr, *prev; | |||
curr = &fenced_buf->head; | |||
prev = curr->prev; | |||
do { | |||
fenced_buf = LIST_ENTRY(struct fenced_buffer, curr, head); | |||
assert(ops->fence_signalled(ops, fenced_buf->fence, 0) == 0); | |||
_fenced_buffer_remove(fenced_list, fenced_buf); | |||
curr = prev; | |||
prev = curr->prev; | |||
} while (curr != &fenced_list->delayed); | |||
} | |||
else { | |||
/* delay destruction */ | |||
} | |||
} | |||
else { | |||
_fenced_buffer_destroy(fenced_buf); | |||
} | |||
assert(!fenced_buf->fence); | |||
#ifdef DEBUG | |||
pipe_mutex_lock(fenced_list->mutex); | |||
assert(fenced_buf->head.prev); | |||
assert(fenced_buf->head.next); | |||
LIST_DEL(&fenced_buf->head); | |||
assert(fenced_list->numUnfenced); | |||
--fenced_list->numUnfenced; | |||
pipe_mutex_unlock(fenced_list->mutex); | |||
#else | |||
(void)fenced_list; | |||
#endif | |||
pb_reference(&fenced_buf->buffer, NULL); | |||
pipe_mutex_destroy(fenced_buf->mutex); | |||
FREE(fenced_buf); | |||
} | |||
@@ -290,24 +314,23 @@ fenced_buffer_map(struct pb_buffer *buf, | |||
struct fenced_buffer *fenced_buf = fenced_buffer(buf); | |||
struct fenced_buffer_list *fenced_list = fenced_buf->list; | |||
struct pb_fence_ops *ops = fenced_list->ops; | |||
void *map; | |||
void *map = NULL; | |||
pipe_mutex_lock(fenced_buf->mutex); | |||
assert(!(flags & PIPE_BUFFER_USAGE_GPU_READ_WRITE)); | |||
/* Serialize writes */ | |||
if((fenced_buf->flags & PIPE_BUFFER_USAGE_GPU_WRITE) || | |||
((fenced_buf->flags & PIPE_BUFFER_USAGE_GPU_READ) && (flags & PIPE_BUFFER_USAGE_CPU_WRITE))) { | |||
if(flags & PIPE_BUFFER_USAGE_DONTBLOCK) { | |||
if((flags & PIPE_BUFFER_USAGE_DONTBLOCK) && | |||
ops->fence_signalled(ops, fenced_buf->fence, 0) == 0) { | |||
/* Don't wait for the GPU to finish writing */ | |||
if(ops->fence_signalled(ops, fenced_buf->fence, 0) == 0) | |||
_fenced_buffer_remove(fenced_list, fenced_buf); | |||
else | |||
return NULL; | |||
} | |||
else { | |||
/* Wait for the GPU to finish writing */ | |||
_fenced_buffer_finish(fenced_buf); | |||
goto finish; | |||
} | |||
/* Wait for the GPU to finish writing */ | |||
fenced_buffer_finish_locked(fenced_list, fenced_buf); | |||
} | |||
#if 0 | |||
@@ -324,6 +347,9 @@ fenced_buffer_map(struct pb_buffer *buf, | |||
fenced_buf->flags |= flags & PIPE_BUFFER_USAGE_CPU_READ_WRITE; | |||
} | |||
finish: | |||
pipe_mutex_unlock(fenced_buf->mutex); | |||
return map; | |||
} | |||
@@ -332,6 +358,9 @@ static void | |||
fenced_buffer_unmap(struct pb_buffer *buf) | |||
{ | |||
struct fenced_buffer *fenced_buf = fenced_buffer(buf); | |||
pipe_mutex_lock(fenced_buf->mutex); | |||
assert(fenced_buf->mapcount); | |||
if(fenced_buf->mapcount) { | |||
pb_unmap(fenced_buf->buffer); | |||
@@ -339,6 +368,8 @@ fenced_buffer_unmap(struct pb_buffer *buf) | |||
if(!fenced_buf->mapcount) | |||
fenced_buf->flags &= ~PIPE_BUFFER_USAGE_CPU_READ_WRITE; | |||
} | |||
pipe_mutex_unlock(fenced_buf->mutex); | |||
} | |||
@@ -350,11 +381,14 @@ fenced_buffer_validate(struct pb_buffer *buf, | |||
struct fenced_buffer *fenced_buf = fenced_buffer(buf); | |||
enum pipe_error ret; | |||
pipe_mutex_lock(fenced_buf->mutex); | |||
if(!vl) { | |||
/* invalidate */ | |||
fenced_buf->vl = NULL; | |||
fenced_buf->validation_flags = 0; | |||
return PIPE_OK; | |||
ret = PIPE_OK; | |||
goto finish; | |||
} | |||
assert(flags & PIPE_BUFFER_USAGE_GPU_READ_WRITE); | |||
@@ -362,14 +396,17 @@ fenced_buffer_validate(struct pb_buffer *buf, | |||
flags &= PIPE_BUFFER_USAGE_GPU_READ_WRITE; | |||
/* Buffer cannot be validated in two different lists */ | |||
if(fenced_buf->vl && fenced_buf->vl != vl) | |||
return PIPE_ERROR_RETRY; | |||
if(fenced_buf->vl && fenced_buf->vl != vl) { | |||
ret = PIPE_ERROR_RETRY; | |||
goto finish; | |||
} | |||
#if 0 | |||
/* Do not validate if buffer is still mapped */ | |||
if(fenced_buf->flags & PIPE_BUFFER_USAGE_CPU_READ_WRITE) { | |||
/* TODO: wait for the thread that mapped the buffer to unmap it */ | |||
return PIPE_ERROR_RETRY; | |||
ret = PIPE_ERROR_RETRY; | |||
goto finish; | |||
} | |||
/* Final sanity checking */ | |||
assert(!(fenced_buf->flags & PIPE_BUFFER_USAGE_CPU_READ_WRITE)); | |||
@@ -379,17 +416,21 @@ fenced_buffer_validate(struct pb_buffer *buf, | |||
if(fenced_buf->vl == vl && | |||
(fenced_buf->validation_flags & flags) == flags) { | |||
/* Nothing to do -- buffer already validated */ | |||
return PIPE_OK; | |||
ret = PIPE_OK; | |||
goto finish; | |||
} | |||
ret = pb_validate(fenced_buf->buffer, vl, flags); | |||
if (ret != PIPE_OK) | |||
return ret; | |||
goto finish; | |||
fenced_buf->vl = vl; | |||
fenced_buf->validation_flags |= flags; | |||
return PIPE_OK; | |||
finish: | |||
pipe_mutex_unlock(fenced_buf->mutex); | |||
return ret; | |||
} | |||
@@ -404,29 +445,36 @@ fenced_buffer_fence(struct pb_buffer *buf, | |||
fenced_buf = fenced_buffer(buf); | |||
fenced_list = fenced_buf->list; | |||
ops = fenced_list->ops; | |||
if(fence == fenced_buf->fence) { | |||
/* Nothing to do */ | |||
return; | |||
} | |||
assert(fenced_buf->vl); | |||
assert(fenced_buf->validation_flags); | |||
pipe_mutex_lock(fenced_list->mutex); | |||
if (fenced_buf->fence) | |||
_fenced_buffer_remove(fenced_list, fenced_buf); | |||
if (fence) { | |||
ops->fence_reference(ops, &fenced_buf->fence, fence); | |||
fenced_buf->flags |= fenced_buf->validation_flags; | |||
_fenced_buffer_add(fenced_buf); | |||
} | |||
pipe_mutex_unlock(fenced_list->mutex); | |||
pipe_mutex_lock(fenced_buf->mutex); | |||
assert(pipe_is_referenced(&fenced_buf->base.base.reference)); | |||
if(fence != fenced_buf->fence) { | |||
assert(fenced_buf->vl); | |||
assert(fenced_buf->validation_flags); | |||
if (fenced_buf->fence) { | |||
fenced_buffer_remove_locked(fenced_list, fenced_buf); | |||
p_atomic_dec(&fenced_buf->base.base.reference.count); | |||
assert(pipe_is_referenced(&fenced_buf->base.base.reference)); | |||
} | |||
if (fence) { | |||
ops->fence_reference(ops, &fenced_buf->fence, fence); | |||
fenced_buf->flags |= fenced_buf->validation_flags; | |||
p_atomic_inc(&fenced_buf->base.base.reference.count); | |||
fenced_buffer_add_locked(fenced_list, fenced_buf); | |||
} | |||
pb_fence(fenced_buf->buffer, fence); | |||
pb_fence(fenced_buf->buffer, fence); | |||
fenced_buf->vl = NULL; | |||
fenced_buf->validation_flags = 0; | |||
} | |||
fenced_buf->vl = NULL; | |||
fenced_buf->validation_flags = 0; | |||
pipe_mutex_unlock(fenced_buf->mutex); | |||
pipe_mutex_unlock(fenced_list->mutex); | |||
} | |||
@@ -436,6 +484,7 @@ fenced_buffer_get_base_buffer(struct pb_buffer *buf, | |||
pb_size *offset) | |||
{ | |||
struct fenced_buffer *fenced_buf = fenced_buffer(buf); | |||
/* NOTE: accesses immutable members only -- mutex not necessary */ | |||
pb_get_base_buffer(fenced_buf->buffer, base_buf, offset); | |||
} | |||
@@ -475,6 +524,8 @@ fenced_buffer_create(struct fenced_buffer_list *fenced_list, | |||
buf->buffer = buffer; | |||
buf->list = fenced_list; | |||
pipe_mutex_init(buf->mutex); | |||
#ifdef DEBUG | |||
pipe_mutex_lock(fenced_list->mutex); | |||
LIST_ADDTAIL(&buf->head, &fenced_list->unfenced); | |||
@@ -516,7 +567,7 @@ fenced_buffer_list_check_free(struct fenced_buffer_list *fenced_list, | |||
int wait) | |||
{ | |||
pipe_mutex_lock(fenced_list->mutex); | |||
_fenced_buffer_list_check_free(fenced_list, wait); | |||
fenced_buffer_list_check_free_locked(fenced_list, wait); | |||
pipe_mutex_unlock(fenced_list->mutex); | |||
} | |||
@@ -538,11 +589,13 @@ fenced_buffer_list_dump(struct fenced_buffer_list *fenced_list) | |||
next = curr->next; | |||
while(curr != &fenced_list->unfenced) { | |||
fenced_buf = LIST_ENTRY(struct fenced_buffer, curr, head); | |||
pipe_mutex_lock(fenced_buf->mutex); | |||
assert(!fenced_buf->fence); | |||
debug_printf("%10p %7u %7u\n", | |||
(void *) fenced_buf, | |||
fenced_buf->base.base.size, | |||
p_atomic_read(&fenced_buf->base.base.reference.count)); | |||
pipe_mutex_unlock(fenced_buf->mutex); | |||
curr = next; | |||
next = curr->next; | |||
} | |||
@@ -552,6 +605,7 @@ fenced_buffer_list_dump(struct fenced_buffer_list *fenced_list) | |||
while(curr != &fenced_list->delayed) { | |||
int signaled; | |||
fenced_buf = LIST_ENTRY(struct fenced_buffer, curr, head); | |||
pipe_mutex_lock(fenced_buf->mutex); | |||
signaled = ops->fence_signalled(ops, fenced_buf->fence, 0); | |||
debug_printf("%10p %7u %7u %10p %s\n", | |||
(void *) fenced_buf, | |||
@@ -559,6 +613,7 @@ fenced_buffer_list_dump(struct fenced_buffer_list *fenced_list) | |||
p_atomic_read(&fenced_buf->base.base.reference.count), | |||
(void *) fenced_buf->fence, | |||
signaled == 0 ? "y" : "n"); | |||
pipe_mutex_unlock(fenced_buf->mutex); | |||
curr = next; | |||
next = curr->next; | |||
} | |||
@@ -579,8 +634,8 @@ fenced_buffer_list_destroy(struct fenced_buffer_list *fenced_list) | |||
#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) | |||
sched_yield(); | |||
#endif | |||
_fenced_buffer_list_check_free(fenced_list, 1); | |||
pipe_mutex_lock(fenced_list->mutex); | |||
fenced_buffer_list_check_free_locked(fenced_list, 1); | |||
} | |||
#ifdef DEBUG | |||
@@ -588,6 +643,7 @@ fenced_buffer_list_destroy(struct fenced_buffer_list *fenced_list) | |||
#endif | |||
pipe_mutex_unlock(fenced_list->mutex); | |||
pipe_mutex_destroy(fenced_list->mutex); | |||
fenced_list->ops->destroy(fenced_list->ops); | |||
@@ -62,9 +62,6 @@ | |||
#define FAST_MATH 1 | |||
/** for tgsi_full_instruction::Flags */ | |||
#define SOA_DEPENDENCY_FLAG 0x1 | |||
#define TILE_TOP_LEFT 0 | |||
#define TILE_TOP_RIGHT 1 | |||
#define TILE_BOTTOM_LEFT 2 | |||
@@ -332,20 +329,6 @@ tgsi_exec_machine_bind_shader( | |||
maxInstructions += 10; | |||
} | |||
if (tgsi_check_soa_dependencies(&parse.FullToken.FullInstruction)) { | |||
uint opcode = parse.FullToken.FullInstruction.Instruction.Opcode; | |||
parse.FullToken.FullInstruction.Flags = SOA_DEPENDENCY_FLAG; | |||
/* XXX we only handle SOA dependencies properly for MOV/SWZ | |||
* at this time! | |||
*/ | |||
if (opcode != TGSI_OPCODE_MOV) { | |||
debug_printf("Warning: SOA dependency in instruction" | |||
" is not handled:\n"); | |||
tgsi_dump_instruction(&parse.FullToken.FullInstruction, | |||
numInstructions); | |||
} | |||
} | |||
memcpy(instructions + numInstructions, | |||
&parse.FullToken.FullInstruction, | |||
sizeof(instructions[0])); | |||
@@ -1847,6 +1830,7 @@ exec_instruction( | |||
{ | |||
uint chan_index; | |||
union tgsi_exec_channel r[10]; | |||
union tgsi_exec_channel d[8]; | |||
(*pc)++; | |||
@@ -1855,42 +1839,27 @@ exec_instruction( | |||
case TGSI_OPCODE_FLR: | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
micro_flr( &r[0], &r[0] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_flr(&d[chan_index], &r[0]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
case TGSI_OPCODE_MOV: | |||
if (inst->Flags & SOA_DEPENDENCY_FLAG) { | |||
/* Do all fetches into temp regs, then do all stores to avoid | |||
* intermediate/accidental clobbering. This could be done all the | |||
* time for MOV but for other instructions we'll need more temps... | |||
*/ | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[chan_index], 0, chan_index ); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
STORE( &r[chan_index], 0, chan_index ); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH(&d[chan_index], 0, chan_index); | |||
} | |||
else { | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
STORE( &r[0], 0, chan_index ); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
case TGSI_OPCODE_LIT: | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_X )) { | |||
STORE( &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], 0, CHAN_X ); | |||
} | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_Y ) || IS_CHANNEL_ENABLED( *inst, CHAN_Z )) { | |||
FETCH( &r[0], 0, CHAN_X ); | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_Y )) { | |||
micro_max( &r[0], &r[0], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C] ); | |||
STORE( &r[0], 0, CHAN_Y ); | |||
micro_max(&d[CHAN_Y], &r[0], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C]); | |||
} | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_Z )) { | |||
@@ -1901,11 +1870,19 @@ exec_instruction( | |||
micro_min( &r[2], &r[2], &mach->Temps[TEMP_128_I].xyzw[TEMP_128_C] ); | |||
micro_max( &r[2], &r[2], &mach->Temps[TEMP_M128_I].xyzw[TEMP_M128_C] ); | |||
micro_pow( &r[1], &r[1], &r[2] ); | |||
micro_lt( &r[0], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C] ); | |||
STORE( &r[0], 0, CHAN_Z ); | |||
micro_lt(&d[CHAN_Z], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C]); | |||
} | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_Y)) { | |||
STORE(&d[CHAN_Y], 0, CHAN_Y); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_Z)) { | |||
STORE(&d[CHAN_Z], 0, CHAN_Z); | |||
} | |||
} | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_X )) { | |||
STORE( &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], 0, CHAN_X ); | |||
} | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_W )) { | |||
STORE( &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], 0, CHAN_W ); | |||
} | |||
@@ -1973,14 +1950,13 @@ exec_instruction( | |||
break; | |||
case TGSI_OPCODE_MUL: | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) | |||
{ | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
FETCH(&r[0], 0, chan_index); | |||
FETCH(&r[1], 1, chan_index); | |||
micro_mul( &r[0], &r[0], &r[1] ); | |||
STORE(&r[0], 0, chan_index); | |||
micro_mul(&d[chan_index], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -1988,8 +1964,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_add( &r[0], &r[0], &r[1] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_add(&d[chan_index], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2045,25 +2023,29 @@ exec_instruction( | |||
break; | |||
case TGSI_OPCODE_DST: | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_X )) { | |||
STORE( &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], 0, CHAN_X ); | |||
} | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_Y )) { | |||
FETCH( &r[0], 0, CHAN_Y ); | |||
FETCH( &r[1], 1, CHAN_Y); | |||
micro_mul( &r[0], &r[0], &r[1] ); | |||
STORE( &r[0], 0, CHAN_Y ); | |||
micro_mul(&d[CHAN_Y], &r[0], &r[1]); | |||
} | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_Z )) { | |||
FETCH( &r[0], 0, CHAN_Z ); | |||
STORE( &r[0], 0, CHAN_Z ); | |||
FETCH(&d[CHAN_Z], 0, CHAN_Z); | |||
} | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_W )) { | |||
FETCH( &r[0], 1, CHAN_W ); | |||
STORE( &r[0], 0, CHAN_W ); | |||
FETCH(&d[CHAN_W], 1, CHAN_W); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_X)) { | |||
STORE(&mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], 0, CHAN_X); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_Y)) { | |||
STORE(&d[CHAN_Y], 0, CHAN_Y); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_Z)) { | |||
STORE(&d[CHAN_Z], 0, CHAN_Z); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_W)) { | |||
STORE(&d[CHAN_W], 0, CHAN_W); | |||
} | |||
break; | |||
@@ -2073,9 +2055,10 @@ exec_instruction( | |||
FETCH(&r[1], 1, chan_index); | |||
/* XXX use micro_min()?? */ | |||
micro_lt( &r[0], &r[0], &r[1], &r[0], &r[1] ); | |||
STORE(&r[0], 0, chan_index); | |||
micro_lt(&d[chan_index], &r[0], &r[1], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2085,9 +2068,10 @@ exec_instruction( | |||
FETCH(&r[1], 1, chan_index); | |||
/* XXX use micro_max()?? */ | |||
micro_lt( &r[0], &r[0], &r[1], &r[1], &r[0] ); | |||
STORE(&r[0], 0, chan_index ); | |||
micro_lt(&d[chan_index], &r[0], &r[1], &r[1], &r[0] ); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2096,8 +2080,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_lt( &r[0], &r[0], &r[1], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_lt(&d[chan_index], &r[0], &r[1], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2106,8 +2092,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_le( &r[0], &r[1], &r[0], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_le(&d[chan_index], &r[1], &r[0], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2118,8 +2106,10 @@ exec_instruction( | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_mul( &r[0], &r[0], &r[1] ); | |||
FETCH( &r[1], 2, chan_index ); | |||
micro_add( &r[0], &r[0], &r[1] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_add(&d[chan_index], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2127,10 +2117,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH(&r[0], 0, chan_index); | |||
FETCH(&r[1], 1, chan_index); | |||
micro_sub( &r[0], &r[0], &r[1] ); | |||
STORE(&r[0], 0, chan_index); | |||
micro_sub(&d[chan_index], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2139,12 +2129,12 @@ exec_instruction( | |||
FETCH(&r[0], 0, chan_index); | |||
FETCH(&r[1], 1, chan_index); | |||
FETCH(&r[2], 2, chan_index); | |||
micro_sub( &r[1], &r[1], &r[2] ); | |||
micro_mul( &r[0], &r[0], &r[1] ); | |||
micro_add( &r[0], &r[0], &r[2] ); | |||
STORE(&r[0], 0, chan_index); | |||
micro_add(&d[chan_index], &r[0], &r[2]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2153,8 +2143,10 @@ exec_instruction( | |||
FETCH(&r[0], 0, chan_index); | |||
FETCH(&r[1], 1, chan_index); | |||
FETCH(&r[2], 2, chan_index); | |||
micro_lt(&r[0], &mach->Temps[TEMP_HALF_I].xyzw[TEMP_HALF_C], &r[2], &r[0], &r[1]); | |||
STORE(&r[0], 0, chan_index); | |||
micro_lt(&d[chan_index], &mach->Temps[TEMP_HALF_I].xyzw[TEMP_HALF_C], &r[2], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2179,8 +2171,10 @@ exec_instruction( | |||
case TGSI_OPCODE_FRC: | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
micro_frc( &r[0], &r[0] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_frc(&d[chan_index], &r[0]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2190,8 +2184,10 @@ exec_instruction( | |||
FETCH(&r[1], 1, chan_index); | |||
micro_max(&r[0], &r[0], &r[1]); | |||
FETCH(&r[1], 2, chan_index); | |||
micro_min(&r[0], &r[0], &r[1]); | |||
STORE(&r[0], 0, chan_index); | |||
micro_min(&d[chan_index], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2199,8 +2195,10 @@ exec_instruction( | |||
case TGSI_OPCODE_ARR: | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
micro_rnd( &r[0], &r[0] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_rnd(&d[chan_index], &r[0]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2247,11 +2245,7 @@ exec_instruction( | |||
FETCH(&r[4], 1, CHAN_Y); | |||
micro_mul( &r[5], &r[3], &r[4] ); | |||
micro_sub( &r[2], &r[2], &r[5] ); | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_X )) { | |||
STORE( &r[2], 0, CHAN_X ); | |||
} | |||
micro_sub(&d[CHAN_X], &r[2], &r[5]); | |||
FETCH(&r[2], 1, CHAN_X); | |||
@@ -2260,20 +2254,21 @@ exec_instruction( | |||
FETCH(&r[5], 0, CHAN_X); | |||
micro_mul( &r[1], &r[1], &r[5] ); | |||
micro_sub( &r[3], &r[3], &r[1] ); | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_Y )) { | |||
STORE( &r[3], 0, CHAN_Y ); | |||
} | |||
micro_sub(&d[CHAN_Y], &r[3], &r[1]); | |||
micro_mul( &r[5], &r[5], &r[4] ); | |||
micro_mul( &r[0], &r[0], &r[2] ); | |||
micro_sub( &r[5], &r[5], &r[0] ); | |||
micro_sub(&d[CHAN_Z], &r[5], &r[0]); | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_Z )) { | |||
STORE( &r[5], 0, CHAN_Z ); | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_X)) { | |||
STORE(&d[CHAN_X], 0, CHAN_X); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_Y)) { | |||
STORE(&d[CHAN_Y], 0, CHAN_Y); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_Z)) { | |||
STORE(&d[CHAN_Z], 0, CHAN_Z); | |||
} | |||
if (IS_CHANNEL_ENABLED( *inst, CHAN_W )) { | |||
STORE( &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], 0, CHAN_W ); | |||
} | |||
@@ -2282,11 +2277,11 @@ exec_instruction( | |||
case TGSI_OPCODE_ABS: | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH(&r[0], 0, chan_index); | |||
micro_abs( &r[0], &r[0] ); | |||
STORE(&r[0], 0, chan_index); | |||
micro_abs(&d[chan_index], &r[0]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
case TGSI_OPCODE_RCC: | |||
@@ -2338,16 +2333,20 @@ exec_instruction( | |||
case TGSI_OPCODE_DDX: | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
micro_ddx( &r[0], &r[0] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_ddx(&d[chan_index], &r[0]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
case TGSI_OPCODE_DDY: | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
micro_ddy( &r[0], &r[0] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_ddy(&d[chan_index], &r[0]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2428,10 +2427,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_eq( &r[0], &r[0], &r[1], | |||
&mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], | |||
&mach->Temps[TEMP_0_I].xyzw[TEMP_0_C] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_eq(&d[chan_index], &r[0], &r[1], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2445,8 +2444,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_le( &r[0], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_le(&d[chan_index], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2462,8 +2463,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_le( &r[0], &r[0], &r[1], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_le(&d[chan_index], &r[0], &r[1], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2471,8 +2474,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_eq( &r[0], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_eq(&d[chan_index], &r[0], &r[1], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2546,13 +2551,8 @@ exec_instruction( | |||
micro_mul(&r[3], &r[3], &r[1]); | |||
micro_add(&r[2], &r[2], &r[3]); | |||
FETCH(&r[3], 0, CHAN_X); | |||
micro_add(&r[2], &r[2], &r[3]); | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_X)) { | |||
STORE(&r[2], 0, CHAN_X); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_Z)) { | |||
STORE(&r[2], 0, CHAN_Z); | |||
} | |||
micro_add(&d[CHAN_X], &r[2], &r[3]); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_Y) || | |||
IS_CHANNEL_ENABLED(*inst, CHAN_W)) { | |||
@@ -2562,13 +2562,20 @@ exec_instruction( | |||
micro_mul(&r[3], &r[3], &r[1]); | |||
micro_add(&r[2], &r[2], &r[3]); | |||
FETCH(&r[3], 0, CHAN_Y); | |||
micro_add(&r[2], &r[2], &r[3]); | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_Y)) { | |||
STORE(&r[2], 0, CHAN_Y); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_W)) { | |||
STORE(&r[2], 0, CHAN_W); | |||
} | |||
micro_add(&d[CHAN_Y], &r[2], &r[3]); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_X)) { | |||
STORE(&d[CHAN_X], 0, CHAN_X); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_Y)) { | |||
STORE(&d[CHAN_Y], 0, CHAN_Y); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_Z)) { | |||
STORE(&d[CHAN_X], 0, CHAN_Z); | |||
} | |||
if (IS_CHANNEL_ENABLED(*inst, CHAN_W)) { | |||
STORE(&d[CHAN_Y], 0, CHAN_W); | |||
} | |||
break; | |||
@@ -2653,8 +2660,10 @@ exec_instruction( | |||
/* TGSI_OPCODE_SGN */ | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
micro_sgn( &r[0], &r[0] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_sgn(&d[chan_index], &r[0]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2663,10 +2672,10 @@ exec_instruction( | |||
FETCH(&r[0], 0, chan_index); | |||
FETCH(&r[1], 1, chan_index); | |||
FETCH(&r[2], 2, chan_index); | |||
micro_lt( &r[0], &r[0], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &r[1], &r[2] ); | |||
STORE(&r[0], 0, chan_index); | |||
micro_lt(&d[chan_index], &r[0], &mach->Temps[TEMP_0_I].xyzw[TEMP_0_C], &r[1], &r[2]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2841,32 +2850,40 @@ exec_instruction( | |||
case TGSI_OPCODE_CEIL: | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
micro_ceil( &r[0], &r[0] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_ceil(&d[chan_index], &r[0]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
case TGSI_OPCODE_I2F: | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
micro_i2f( &r[0], &r[0] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_i2f(&d[chan_index], &r[0]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
case TGSI_OPCODE_NOT: | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
micro_not( &r[0], &r[0] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_not(&d[chan_index], &r[0]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
case TGSI_OPCODE_TRUNC: | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
micro_trunc( &r[0], &r[0] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_trunc(&d[chan_index], &r[0]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2874,8 +2891,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_shl( &r[0], &r[0], &r[1] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_shl(&d[chan_index], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2883,8 +2902,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_ishr( &r[0], &r[0], &r[1] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_ishr(&d[chan_index], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2892,8 +2913,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_and( &r[0], &r[0], &r[1] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_and(&d[chan_index], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2901,8 +2924,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_or( &r[0], &r[0], &r[1] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_or(&d[chan_index], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -2914,8 +2939,10 @@ exec_instruction( | |||
FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { | |||
FETCH( &r[0], 0, chan_index ); | |||
FETCH( &r[1], 1, chan_index ); | |||
micro_xor( &r[0], &r[0], &r[1] ); | |||
STORE( &r[0], 0, chan_index ); | |||
micro_xor(&d[chan_index], &r[0], &r[1]); | |||
} | |||
FOR_EACH_ENABLED_CHANNEL(*inst, chan_index) { | |||
STORE(&d[chan_index], 0, chan_index); | |||
} | |||
break; | |||
@@ -180,3 +180,42 @@ identity_transfer_destroy(struct identity_transfer *id_transfer) | |||
screen->tex_transfer_destroy(id_transfer->transfer); | |||
FREE(id_transfer); | |||
} | |||
struct pipe_video_surface * | |||
identity_video_surface_create(struct identity_screen *id_screen, | |||
struct pipe_video_surface *video_surface) | |||
{ | |||
struct identity_video_surface *id_video_surface; | |||
if (!video_surface) { | |||
goto error; | |||
} | |||
assert(video_surface->screen == id_screen->screen); | |||
id_video_surface = CALLOC_STRUCT(identity_video_surface); | |||
if (!id_video_surface) { | |||
goto error; | |||
} | |||
memcpy(&id_video_surface->base, | |||
video_surface, | |||
sizeof(struct pipe_video_surface)); | |||
pipe_reference_init(&id_video_surface->base.reference, 1); | |||
id_video_surface->base.screen = &id_screen->base; | |||
id_video_surface->video_surface = video_surface; | |||
return &id_video_surface->base; | |||
error: | |||
pipe_video_surface_reference(&video_surface, NULL); | |||
return NULL; | |||
} | |||
void | |||
identity_video_surface_destroy(struct identity_video_surface *id_video_surface) | |||
{ | |||
pipe_video_surface_reference(&id_video_surface->video_surface, NULL); | |||
FREE(id_video_surface); | |||
} |
@@ -31,6 +31,7 @@ | |||
#include "pipe/p_compiler.h" | |||
#include "pipe/p_state.h" | |||
#include "pipe/p_video_state.h" | |||
#include "id_screen.h" | |||
@@ -67,6 +68,14 @@ struct identity_transfer | |||
}; | |||
struct identity_video_surface | |||
{ | |||
struct pipe_video_surface base; | |||
struct pipe_video_surface *video_surface; | |||
}; | |||
static INLINE struct identity_buffer * | |||
identity_buffer(struct pipe_buffer *_buffer) | |||
{ | |||
@@ -103,6 +112,15 @@ identity_transfer(struct pipe_transfer *_transfer) | |||
return (struct identity_transfer *)_transfer; | |||
} | |||
static INLINE struct identity_video_surface * | |||
identity_video_surface(struct pipe_video_surface *_video_surface) | |||
{ | |||
if (!_video_surface) { | |||
return NULL; | |||
} | |||
(void)identity_screen(_video_surface->screen); | |||
return (struct identity_video_surface *)_video_surface; | |||
} | |||
static INLINE struct pipe_buffer * | |||
identity_buffer_unwrap(struct pipe_buffer *_buffer) | |||
@@ -165,5 +183,12 @@ identity_transfer_create(struct identity_texture *id_texture, | |||
void | |||
identity_transfer_destroy(struct identity_transfer *id_transfer); | |||
struct pipe_video_surface * | |||
identity_video_surface_create(struct identity_screen *id_screen, | |||
struct pipe_video_surface *video_surface); | |||
void | |||
identity_video_surface_destroy(struct identity_video_surface *id_video_surface); | |||
#endif /* ID_OBJECTS_H */ |
@@ -37,4 +37,4 @@ identity_screen_create(struct pipe_screen *screen); | |||
struct pipe_context * | |||
identity_context_create(struct pipe_screen *screen, struct pipe_context *pipe); | |||
#endif /* PT_PUBLIC_H */ | |||
#endif /* ID_PUBLIC_H */ |
@@ -379,6 +379,33 @@ identity_screen_buffer_destroy(struct pipe_buffer *_buffer) | |||
identity_buffer_destroy(identity_buffer(_buffer)); | |||
} | |||
static struct pipe_video_surface * | |||
identity_screen_video_surface_create(struct pipe_screen *_screen, | |||
enum pipe_video_chroma_format chroma_format, | |||
unsigned width, | |||
unsigned height) | |||
{ | |||
struct identity_screen *id_screen = identity_screen(_screen); | |||
struct pipe_screen *screen = id_screen->screen; | |||
struct pipe_video_surface *result; | |||
result = screen->video_surface_create(screen, | |||
chroma_format, | |||
width, | |||
height); | |||
if (result) { | |||
return identity_video_surface_create(id_screen, result); | |||
} | |||
return NULL; | |||
} | |||
static void | |||
identity_screen_video_surface_destroy(struct pipe_video_surface *_vsfc) | |||
{ | |||
identity_video_surface_destroy(identity_video_surface(_vsfc)); | |||
} | |||
static void | |||
identity_screen_flush_frontbuffer(struct pipe_screen *_screen, | |||
struct pipe_surface *_surface, | |||
@@ -472,6 +499,12 @@ identity_screen_create(struct pipe_screen *screen) | |||
if (screen->buffer_unmap) | |||
id_screen->base.buffer_unmap = identity_screen_buffer_unmap; | |||
id_screen->base.buffer_destroy = identity_screen_buffer_destroy; | |||
if (screen->video_surface_create) { | |||
id_screen->base.video_surface_create = identity_screen_video_surface_create; | |||
} | |||
if (screen->video_surface_destroy) { | |||
id_screen->base.video_surface_destroy = identity_screen_video_surface_destroy; | |||
} | |||
id_screen->base.flush_frontbuffer = identity_screen_flush_frontbuffer; | |||
id_screen->base.fence_reference = identity_screen_fence_reference; | |||
id_screen->base.fence_signalled = identity_screen_fence_signalled; |
@@ -38,11 +38,11 @@ static void TAG(emit)(GLcontext *ctx, GLuint start, GLuint end) | |||
#endif | |||
#if (IND & (FFB_VB_RGBA_BIT)) | |||
col0 = VB->ColorPtr[0]->data; | |||
col0_stride = VB->ColorPtr[0]->stride; | |||
col0 = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; | |||
col0_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; | |||
#if (IND & (FFB_VB_TWOSIDE_BIT)) | |||
col1 = VB->ColorPtr[1]->data; | |||
col1_stride = VB->ColorPtr[1]->stride; | |||
col1 = VB->BackfaceColorPtr->data; | |||
col1_stride = VB->BackfaceColorPtr->stride; | |||
#endif | |||
#endif | |||
@@ -53,13 +53,13 @@ static void gamma_emit( GLcontext *ctx, GLuint start, GLuint end) | |||
GLfloat (*tc0)[4] = 0; | |||
GLuint tc0_size = 0; | |||
col = VB->ColorPtr[0]->data; | |||
col_stride = VB->ColorPtr[0]->stride; | |||
col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; | |||
col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; | |||
if (ctx->Texture.Unit[0]._ReallyEnabled) { | |||
tc0_stride = VB->TexCoordPtr[0]->stride; | |||
tc0 = VB->TexCoordPtr[0]->data; | |||
tc0_size = VB->TexCoordPtr[0]->size; | |||
tc0_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0]->stride; | |||
tc0 = VB->AttribPtr[_TNL_ATTRIB_TEX0]->data; | |||
tc0_size = VB->AttribPtr[_TNL_ATTRIB_TEX0]->size; | |||
coord = VB->ClipPtr->data; | |||
coord_stride = VB->ClipPtr->stride; | |||
} else { |
@@ -27,6 +27,7 @@ | |||
#include "main/mtypes.h" | |||
#include "main/enums.h" | |||
#include "main/colormac.h" | |||
#include "intel_mipmap_tree.h" | |||
#include "intel_tex.h" | |||
@@ -311,11 +312,10 @@ i830_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3) | |||
CLAMPED_FLOAT_TO_UBYTE(border[2], tObj->BorderColor[2]); | |||
CLAMPED_FLOAT_TO_UBYTE(border[3], tObj->BorderColor[3]); | |||
state[I830_TEXREG_TM0S4] = INTEL_PACKCOLOR8888(border[0], | |||
border[1], | |||
border[2], | |||
border[3]); | |||
state[I830_TEXREG_TM0S4] = PACK_COLOR_8888(border[3], | |||
border[0], | |||
border[1], | |||
border[2]); | |||
I830_ACTIVESTATE(i830, I830_UPLOAD_TEX(unit), GL_TRUE); | |||
/* memcmp was already disabled, but definitely won't work as the |
@@ -126,7 +126,7 @@ i830_render_start(struct intel_context *intel) | |||
for (i = 0; i < I830_TEX_UNITS; i++) { | |||
if (RENDERINPUTS_TEST(index_bitset, _TNL_ATTRIB_TEX(i))) { | |||
GLuint sz = VB->TexCoordPtr[i]->size; | |||
GLuint sz = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size; | |||
GLuint emit; | |||
GLuint mcs = (i830->state.Tex[i][I830_TEXREG_MCS] & | |||
~TEXCOORDTYPE_MASK); | |||
@@ -714,9 +714,6 @@ i830_new_batch(struct intel_context *intel) | |||
{ | |||
struct i830_context *i830 = i830_context(&intel->ctx); | |||
i830->state.emitted = 0; | |||
/* Check that we didn't just wrap our batchbuffer at a bad time. */ | |||
assert(!intel->no_batch_wrap); | |||
} | |||
static void |
@@ -1301,7 +1301,7 @@ i915ValidateFragmentProgram(struct i915_context *i915) | |||
for (i = 0; i < p->ctx->Const.MaxTextureCoordUnits; i++) { | |||
if (inputsRead & FRAG_BIT_TEX(i)) { | |||
int sz = VB->TexCoordPtr[i]->size; | |||
int sz = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size; | |||
s2 &= ~S2_TEXCOORD_FMT(i, S2_TEXCOORD_FMT0_MASK); | |||
s2 |= S2_TEXCOORD_FMT(i, SZ_TO_HW(sz)); |
@@ -28,6 +28,7 @@ | |||
#include "main/mtypes.h" | |||
#include "main/enums.h" | |||
#include "main/macros.h" | |||
#include "main/colormac.h" | |||
#include "intel_mipmap_tree.h" | |||
#include "intel_tex.h" | |||
@@ -363,15 +364,15 @@ i915_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3) | |||
* R channel, while the hardware uses A. Spam R into all the channels | |||
* for safety. | |||
*/ | |||
state[I915_TEXREG_SS4] = INTEL_PACKCOLOR8888(border[0], | |||
border[0], | |||
border[0], | |||
border[0]); | |||
state[I915_TEXREG_SS4] = PACK_COLOR_8888(border[0], | |||
border[0], | |||
border[0], | |||
border[0]); | |||
} else { | |||
state[I915_TEXREG_SS4] = INTEL_PACKCOLOR8888(border[0], | |||
border[1], | |||
border[2], | |||
border[3]); | |||
state[I915_TEXREG_SS4] = PACK_COLOR_8888(border[3], | |||
border[0], | |||
border[1], | |||
border[2]); | |||
} | |||
@@ -667,9 +667,6 @@ i915_new_batch(struct intel_context *intel) | |||
* difficulties associated with them (physical address requirements). | |||
*/ | |||
i915->state.emitted = 0; | |||
/* Check that we didn't just wrap our batchbuffer at a bad time. */ | |||
assert(!intel->no_batch_wrap); | |||
} | |||
static void |
@@ -1250,81 +1250,6 @@ union fi | |||
GLint i; | |||
}; | |||
/**********************************************************************/ | |||
/* Used only with the metaops callbacks. */ | |||
/**********************************************************************/ | |||
static void | |||
intel_meta_draw_poly(struct intel_context *intel, | |||
GLuint n, | |||
GLfloat xy[][2], | |||
GLfloat z, GLuint color, GLfloat tex[][2]) | |||
{ | |||
union fi *vb; | |||
GLint i; | |||
unsigned int saved_vertex_size = intel->vertex_size; | |||
LOCK_HARDWARE(intel); | |||
intel->vertex_size = 6; | |||
/* All 3d primitives should be emitted with LOOP_CLIPRECTS, | |||
* otherwise the drawing origin (DR4) might not be set correctly. | |||
*/ | |||
intel_set_prim(intel, PRIM3D_TRIFAN); | |||
vb = (union fi *) intel_get_prim_space(intel, n); | |||
for (i = 0; i < n; i++) { | |||
vb[0].f = xy[i][0]; | |||
vb[1].f = xy[i][1]; | |||
vb[2].f = z; | |||
vb[3].i = color; | |||
vb[4].f = tex[i][0]; | |||
vb[5].f = tex[i][1]; | |||
vb += 6; | |||
} | |||
INTEL_FIREVERTICES(intel); | |||
intel->vertex_size = saved_vertex_size; | |||
UNLOCK_HARDWARE(intel); | |||
} | |||
static void | |||
intel_meta_draw_quad(struct intel_context *intel, | |||
GLfloat x0, GLfloat x1, | |||
GLfloat y0, GLfloat y1, | |||
GLfloat z, | |||
GLuint color, | |||
GLfloat s0, GLfloat s1, GLfloat t0, GLfloat t1) | |||
{ | |||
GLfloat xy[4][2]; | |||
GLfloat tex[4][2]; | |||
xy[0][0] = x0; | |||
xy[0][1] = y0; | |||
xy[1][0] = x1; | |||
xy[1][1] = y0; | |||
xy[2][0] = x1; | |||
xy[2][1] = y1; | |||
xy[3][0] = x0; | |||
xy[3][1] = y1; | |||
tex[0][0] = s0; | |||
tex[0][1] = t0; | |||
tex[1][0] = s1; | |||
tex[1][1] = t0; | |||
tex[2][0] = s1; | |||
tex[2][1] = t1; | |||
tex[3][0] = s0; | |||
tex[3][1] = t1; | |||
intel_meta_draw_poly(intel, 4, xy, z, color, tex); | |||
} | |||
/**********************************************************************/ | |||
/* Initialization. */ | |||
/**********************************************************************/ | |||
@@ -1333,7 +1258,6 @@ intel_meta_draw_quad(struct intel_context *intel, | |||
void | |||
intelInitTriFuncs(GLcontext * ctx) | |||
{ | |||
struct intel_context *intel = intel_context(ctx); | |||
TNLcontext *tnl = TNL_CONTEXT(ctx); | |||
static int firsttime = 1; | |||
@@ -1350,6 +1274,4 @@ intelInitTriFuncs(GLcontext * ctx) | |||
tnl->Driver.Render.BuildVertices = _tnl_build_vertices; | |||
tnl->Driver.Render.CopyPV = _tnl_copy_pv; | |||
tnl->Driver.Render.Interp = _tnl_interp; | |||
intel->vtbl.meta_draw_quad = intel_meta_draw_quad; | |||
} |
@@ -172,8 +172,8 @@ struct brw_fragment_program { | |||
GLuint id; /**< serial no. to identify frag progs, never re-used */ | |||
GLboolean isGLSL; /**< really, any IF/LOOP/CONT/BREAK instructions */ | |||
dri_bo *const_buffer; /** Program constant buffer/surface */ | |||
GLboolean use_const_buffer; | |||
dri_bo *const_buffer; /** Program constant buffer/surface */ | |||
/** for debugging, which texture units are referenced */ | |||
GLbitfield tex_units_used; | |||
@@ -438,7 +438,6 @@ struct brw_context | |||
GLuint primitive; | |||
GLboolean emit_state_always; | |||
GLboolean no_batch_wrap; | |||
struct { | |||
struct brw_state_flags dirty; |
@@ -145,7 +145,7 @@ static void brw_emit_prim(struct brw_context *brw, | |||
prim_packet.base_vert_location = prim->basevertex; | |||
/* Can't wrap here, since we rely on the validated state. */ | |||
brw->no_batch_wrap = GL_TRUE; | |||
intel->no_batch_wrap = GL_TRUE; | |||
/* If we're set to always flush, do it before and after the primitive emit. | |||
* We want to catch both missed flushes that hurt instruction/state cache | |||
@@ -163,7 +163,7 @@ static void brw_emit_prim(struct brw_context *brw, | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
} | |||
brw->no_batch_wrap = GL_FALSE; | |||
intel->no_batch_wrap = GL_FALSE; | |||
} | |||
static void brw_merge_inputs( struct brw_context *brw, |
@@ -243,14 +243,6 @@ static void wrap_buffers( struct brw_context *brw, | |||
dri_bo_unreference(brw->vb.upload.bo); | |||
brw->vb.upload.bo = dri_bo_alloc(brw->intel.bufmgr, "temporary VBO", | |||
size, 1); | |||
/* Set the internal VBO\ to no-backing-store. We only use them as a | |||
* temporary within a brw_try_draw_prims while the lock is held. | |||
*/ | |||
/* DON'T DO THIS AS IF WE HAVE TO RE-ORG MEMORY WE NEED SOMEWHERE WITH | |||
FAKE TO PUSH THIS STUFF */ | |||
// if (!brw->intel.ttm) | |||
// dri_bo_fake_disable_backing_store(brw->vb.upload.bo, NULL, NULL); | |||
} | |||
static void get_space( struct brw_context *brw, |
@@ -144,9 +144,6 @@ static void brw_new_batch( struct intel_context *intel ) | |||
{ | |||
struct brw_context *brw = brw_context(&intel->ctx); | |||
/* Check that we didn't just wrap our batchbuffer at a bad time. */ | |||
assert(!brw->no_batch_wrap); | |||
brw->curbe.need_new_bo = GL_TRUE; | |||
/* Mark all context state as needing to be re-emitted. |
@@ -76,10 +76,10 @@ struct brw_wm_prog_key { | |||
GLushort tex_swizzles[BRW_MAX_TEX_UNIT]; | |||
GLuint program_string_id:32; | |||
GLushort origin_x, origin_y; | |||
GLushort drawable_height; | |||
GLbitfield64 vp_outputs_written; | |||
GLuint program_string_id:32; | |||
}; | |||
@@ -138,7 +138,6 @@ static struct prog_dst_register dst_reg(GLuint file, GLuint idx) | |||
reg.CondMask = COND_TR; | |||
reg.CondSwizzle = 0; | |||
reg.CondSrc = 0; | |||
reg.pad = 0; | |||
return reg; | |||
} | |||
@@ -80,7 +80,7 @@ intel_batchbuffer_reset(struct intel_batchbuffer *batch) | |||
batch->buf = NULL; | |||
} | |||
if (!batch->buffer && intel->ttm == GL_TRUE) | |||
if (!batch->buffer) | |||
batch->buffer = malloc (intel->maxBatchSize); | |||
batch->buf = dri_bo_alloc(intel->bufmgr, "batchbuffer", | |||
@@ -212,7 +212,7 @@ _intel_batchbuffer_flush(struct intel_batchbuffer *batch, const char *file, | |||
batch->reserved_space = 0; | |||
/* Emit a flush if the bufmgr doesn't do it for us. */ | |||
if (intel->always_flush_cache || !intel->ttm) { | |||
if (intel->always_flush_cache) { | |||
intel_batchbuffer_emit_mi_flush(batch); | |||
used = batch->ptr - batch->map; | |||
} | |||
@@ -244,6 +244,9 @@ _intel_batchbuffer_flush(struct intel_batchbuffer *batch, const char *file, | |||
if (intel->vtbl.finish_batch) | |||
intel->vtbl.finish_batch(intel); | |||
/* Check that we didn't just wrap our batchbuffer at a bad time. */ | |||
assert(!intel->no_batch_wrap); | |||
batch->reserved_space = BATCH_RESERVED; | |||
/* TODO: Just pass the relocation list and dma buffer up to the |
@@ -499,10 +499,11 @@ intelClearWithBlit(GLcontext *ctx, GLbitfield mask) | |||
switch (irb->texformat) { | |||
case MESA_FORMAT_ARGB8888: | |||
case MESA_FORMAT_XRGB8888: | |||
clearVal = intel->ClearColor8888; | |||
clearVal = PACK_COLOR_8888(clear[3], clear[0], | |||
clear[1], clear[2]); | |||
break; | |||
case MESA_FORMAT_RGB565: | |||
clearVal = intel->ClearColor565; | |||
clearVal = PACK_COLOR_565(clear[0], clear[1], clear[2]); | |||
break; | |||
case MESA_FORMAT_ARGB4444: | |||
clearVal = PACK_COLOR_4444(clear[3], clear[0], |
@@ -176,9 +176,7 @@ intelGetString(GLcontext * ctx, GLenum name) | |||
break; | |||
} | |||
(void) driGetRendererString(buffer, chipset, | |||
(intel->ttm) ? DRIVER_DATE_GEM : DRIVER_DATE, | |||
0); | |||
(void) driGetRendererString(buffer, chipset, DRIVER_DATE_GEM, 0); | |||
return (GLubyte *) buffer; | |||
default: | |||
@@ -601,6 +599,7 @@ intelInitContext(struct intel_context *intel, | |||
__DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; | |||
intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private; | |||
int fthrottle_mode; | |||
int bo_reuse_mode; | |||
if (!_mesa_initialize_context(&intel->ctx, mesaVis, shareCtx, | |||
functions, (void *) intel)) { | |||
@@ -635,18 +634,14 @@ intelInitContext(struct intel_context *intel, | |||
intel->maxBatchSize = BATCH_SZ; | |||
intel->bufmgr = intelScreen->bufmgr; | |||
intel->ttm = intelScreen->ttm; | |||
if (intel->ttm) { | |||
int bo_reuse_mode; | |||
bo_reuse_mode = driQueryOptioni(&intel->optionCache, "bo_reuse"); | |||
switch (bo_reuse_mode) { | |||
case DRI_CONF_BO_REUSE_DISABLED: | |||
break; | |||
case DRI_CONF_BO_REUSE_ALL: | |||
intel_bufmgr_gem_enable_reuse(intel->bufmgr); | |||
break; | |||
} | |||
bo_reuse_mode = driQueryOptioni(&intel->optionCache, "bo_reuse"); | |||
switch (bo_reuse_mode) { | |||
case DRI_CONF_BO_REUSE_DISABLED: | |||
break; | |||
case DRI_CONF_BO_REUSE_ALL: | |||
intel_bufmgr_gem_enable_reuse(intel->bufmgr); | |||
break; | |||
} | |||
/* This doesn't yet catch all non-conformant rendering, but it's a | |||
@@ -733,12 +728,6 @@ intelInitContext(struct intel_context *intel, | |||
intel->RenderIndex = ~0; | |||
fthrottle_mode = driQueryOptioni(&intel->optionCache, "fthrottle_mode"); | |||
intel->irqsEmitted = 0; | |||
intel->do_irqs = (intel->intelScreen->irq_active && | |||
fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS); | |||
intel->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS); | |||
if (intel->gen >= 4 && !intel->intelScreen->irq_active) { | |||
_mesa_printf("IRQs not active. Exiting\n"); | |||
@@ -1058,21 +1047,6 @@ intelContendedLock(struct intel_context *intel, GLuint flags) | |||
sarea->ctxOwner = me; | |||
} | |||
/* If the last consumer of the texture memory wasn't us, notify the fake | |||
* bufmgr and record the new owner. We should have the memory shared | |||
* between contexts of a single fake bufmgr, but this will at least make | |||
* things correct for now. | |||
*/ | |||
if (!intel->ttm && sarea->texAge != intel->hHWContext) { | |||
sarea->texAge = intel->hHWContext; | |||
intel_bufmgr_fake_contended_lock_take(intel->bufmgr); | |||
if (INTEL_DEBUG & DEBUG_BATCH) | |||
intel_decode_context_reset(); | |||
if (INTEL_DEBUG & DEBUG_BUFMGR) | |||
fprintf(stderr, "Lost Textures: sarea->texAge %x hw context %x\n", | |||
sarea->ctxOwner, intel->hHWContext); | |||
} | |||
/* Drawable changed? | |||
*/ | |||
if (dPriv && intel->lastStamp != dPriv->lastStamp) { |
@@ -135,14 +135,6 @@ struct intel_context | |||
struct intel_region * draw_region, | |||
struct intel_region * depth_region); | |||
void (*meta_draw_quad)(struct intel_context *intel, | |||
GLfloat x0, GLfloat x1, | |||
GLfloat y0, GLfloat y1, | |||
GLfloat z, | |||
GLuint color, /* ARGB32 */ | |||
GLfloat s0, GLfloat s1, | |||
GLfloat t0, GLfloat t1); | |||
void (*meta_color_mask) (struct intel_context * intel, GLboolean); | |||
void (*meta_stencil_replace) (struct intel_context * intel, | |||
@@ -189,12 +181,6 @@ struct intel_context | |||
struct intel_region *back_region; | |||
struct intel_region *depth_region; | |||
/** | |||
* This value indicates that the kernel memory manager is being used | |||
* instead of the fake client-side memory manager. | |||
*/ | |||
GLboolean ttm; | |||
struct intel_batchbuffer *batch; | |||
drm_intel_bo *first_post_swapbuffers_batch; | |||
GLboolean no_batch_wrap; | |||
@@ -217,10 +203,6 @@ struct intel_context | |||
char *prevLockFile; | |||
int prevLockLine; | |||
GLuint ClearColor565; | |||
GLuint ClearColor8888; | |||
/* Offsets of fields within the current vertex: | |||
*/ | |||
GLuint coloroffset; | |||
@@ -237,6 +219,7 @@ struct intel_context | |||
GLboolean hw_stipple; | |||
GLboolean depth_buffer_is_float; | |||
GLboolean no_rast; | |||
GLboolean no_hw; | |||
GLboolean always_flush_batch; | |||
GLboolean always_flush_cache; | |||
@@ -302,13 +285,6 @@ struct intel_context | |||
GLboolean use_early_z; | |||
drm_clip_rect_t fboRect; /**< cliprect for FBO rendering */ | |||
int perf_boxes; | |||
GLuint do_usleeps; | |||
int do_irqs; | |||
GLuint irqsEmitted; | |||
GLboolean scissor; | |||
drm_clip_rect_t draw_rect; | |||
drm_clip_rect_t scissor_rect; | |||
@@ -325,8 +301,6 @@ struct intel_context | |||
GLuint lastStamp; | |||
GLboolean no_hw; | |||
/** | |||
* Configuration cache | |||
*/ | |||
@@ -373,29 +347,6 @@ do { \ | |||
(intel)->prim.flush(intel); \ | |||
} while (0) | |||
/* ================================================================ | |||
* Color packing: | |||
*/ | |||
#define INTEL_PACKCOLOR4444(r,g,b,a) \ | |||
((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4)) | |||
#define INTEL_PACKCOLOR1555(r,g,b,a) \ | |||
((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \ | |||
((a) ? 0x8000 : 0)) | |||
#define INTEL_PACKCOLOR565(r,g,b) \ | |||
((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3)) | |||
#define INTEL_PACKCOLOR8888(r,g,b,a) \ | |||
((a<<24) | (r<<16) | (g<<8) | b) | |||
#define INTEL_PACKCOLOR(format, r, g, b, a) \ | |||
(format == DV_PF_555 ? INTEL_PACKCOLOR1555(r,g,b,a) : \ | |||
(format == DV_PF_565 ? INTEL_PACKCOLOR565(r,g,b) : \ | |||
(format == DV_PF_8888 ? INTEL_PACKCOLOR8888(r,g,b,a) : \ | |||
0))) | |||
/* ================================================================ | |||
* From linux kernel i386 header files, copes with odd sizes better | |||
* than COPY_DWORDS would: |
@@ -79,6 +79,7 @@ static const struct dri_extension card_extensions[] = { | |||
{ "GL_ARB_half_float_pixel", NULL }, | |||
{ "GL_ARB_map_buffer_range", GL_ARB_map_buffer_range_functions }, | |||
{ "GL_ARB_multitexture", NULL }, | |||
{ "GL_ARB_pixel_buffer_object", NULL }, | |||
{ "GL_ARB_point_parameters", GL_ARB_point_parameters_functions }, | |||
{ "GL_ARB_point_sprite", NULL }, | |||
{ "GL_ARB_shader_objects", GL_ARB_shader_objects_functions }, | |||
@@ -104,6 +105,8 @@ static const struct dri_extension card_extensions[] = { | |||
{ "GL_EXT_blend_logic_op", NULL }, | |||
{ "GL_EXT_blend_subtract", NULL }, | |||
{ "GL_EXT_cull_vertex", GL_EXT_cull_vertex_functions }, | |||
{ "GL_EXT_framebuffer_blit", GL_EXT_framebuffer_blit_functions }, | |||
{ "GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions }, | |||
{ "GL_EXT_fog_coord", GL_EXT_fog_coord_functions }, | |||
{ "GL_EXT_gpu_program_parameters", GL_EXT_gpu_program_parameters_functions }, | |||
{ "GL_EXT_packed_depth_stencil", NULL }, | |||
@@ -176,14 +179,6 @@ static const struct dri_extension arb_oq_extensions[] = { | |||
{ NULL, NULL } | |||
}; | |||
static const struct dri_extension ttm_extensions[] = { | |||
{ "GL_ARB_pixel_buffer_object", NULL }, | |||
{ "GL_EXT_framebuffer_blit", GL_EXT_framebuffer_blit_functions }, | |||
{ "GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions }, | |||
{ NULL, NULL } | |||
}; | |||
static const struct dri_extension fragment_shader_extensions[] = { | |||
{ "GL_ARB_fragment_shader", NULL }, | |||
{ NULL, NULL } | |||
@@ -202,9 +197,6 @@ intelInitExtensions(GLcontext *ctx) | |||
*/ | |||
driInitExtensions(ctx, card_extensions, GL_FALSE); | |||
if (intel->ttm) | |||
driInitExtensions(ctx, ttm_extensions, GL_FALSE); | |||
if (IS_965(intel->intelScreen->deviceID)) | |||
driInitExtensions(ctx, brw_extensions, GL_FALSE); | |||
@@ -224,16 +224,12 @@ int intel_miptree_pitch_align (struct intel_context *intel, | |||
if (!mt->compressed) { | |||
int pitch_align; | |||
if (intel->ttm) { | |||
/* XXX: Align pitch to multiple of 64 bytes for now to allow | |||
* render-to-texture to work in all cases. This should probably be | |||
* replaced at some point by some scheme to only do this when really | |||
* necessary. | |||
*/ | |||
pitch_align = 64; | |||
} else { | |||
pitch_align = 4; | |||
} | |||
/* XXX: Align pitch to multiple of 64 bytes for now to allow | |||
* render-to-texture to work in all cases. This should probably be | |||
* replaced at some point by some scheme to only do this when really | |||
* necessary. | |||
*/ | |||
pitch_align = 64; | |||
if (tiling == I915_TILING_X) | |||
pitch_align = 512; |
@@ -228,10 +228,9 @@ do_blit_bitmap( GLcontext *ctx, | |||
UNCLAMPED_FLOAT_TO_UBYTE(ubcolor[3], tmpColor[3]); | |||
if (dst->cpp == 2) | |||
color = INTEL_PACKCOLOR565(ubcolor[0], ubcolor[1], ubcolor[2]); | |||
color = PACK_COLOR_565(ubcolor[0], ubcolor[1], ubcolor[2]); | |||
else | |||
color = INTEL_PACKCOLOR8888(ubcolor[0], ubcolor[1], | |||
ubcolor[2], ubcolor[3]); | |||
color = PACK_COLOR_8888(ubcolor[3], ubcolor[0], ubcolor[1], ubcolor[2]); | |||
if (!intel_check_blit_fragment_ops(ctx, tmpColor[3] == 1.0F)) | |||
return GL_FALSE; |
@@ -542,55 +542,18 @@ intel_recreate_static(struct intel_context *intel, | |||
region->buffer = NULL; | |||
} | |||
if (intel->ttm) { | |||
assert(region_desc->bo_handle != -1); | |||
region->buffer = intel_bo_gem_create_from_name(intel->bufmgr, | |||
name, | |||
region_desc->bo_handle); | |||
ret = dri_bo_get_tiling(region->buffer, ®ion->tiling, | |||
®ion->bit_6_swizzle); | |||
if (ret != 0) { | |||
fprintf(stderr, "Couldn't get tiling of buffer %d (%s): %s\n", | |||
region_desc->bo_handle, name, strerror(-ret)); | |||
intel_region_release(®ion); | |||
return NULL; | |||
} | |||
} else { | |||
if (region->classic_map != NULL) { | |||
drmUnmap(region->classic_map, | |||
region->pitch * region->cpp * region->height); | |||
region->classic_map = NULL; | |||
} | |||
ret = drmMap(intel->driFd, region_desc->handle, | |||
region->pitch * region->cpp * region->height, | |||
®ion->classic_map); | |||
if (ret != 0) { | |||
fprintf(stderr, "Failed to drmMap %s buffer\n", name); | |||
free(region); | |||
return NULL; | |||
} | |||
region->buffer = intel_bo_fake_alloc_static(intel->bufmgr, | |||
assert(region_desc->bo_handle != -1); | |||
region->buffer = intel_bo_gem_create_from_name(intel->bufmgr, | |||
name, | |||
region_desc->offset, | |||
region->pitch * region->cpp * | |||
region->height, | |||
region->classic_map); | |||
/* The sarea just gives us a boolean for whether it's tiled or not, | |||
* instead of which tiling mode it is. Guess. | |||
*/ | |||
if (region_desc->tiled) { | |||
if (intel->gen >= 4 && region_desc == &intelScreen->depth) | |||
region->tiling = I915_TILING_Y; | |||
else | |||
region->tiling = I915_TILING_X; | |||
} else { | |||
region->tiling = I915_TILING_NONE; | |||
} | |||
region_desc->bo_handle); | |||
region->bit_6_swizzle = I915_BIT_6_SWIZZLE_NONE; | |||
ret = dri_bo_get_tiling(region->buffer, ®ion->tiling, | |||
®ion->bit_6_swizzle); | |||
if (ret != 0) { | |||
fprintf(stderr, "Couldn't get tiling of buffer %d (%s): %s\n", | |||
region_desc->bo_handle, name, strerror(-ret)); | |||
intel_region_release(®ion); | |||
return NULL; | |||
} | |||
assert(region->buffer != NULL); |
@@ -605,7 +605,6 @@ intelFillInModes(__DRIscreenPrivate *psp, | |||
static GLboolean | |||
intel_init_bufmgr(intelScreenPrivate *intelScreen) | |||
{ | |||
GLboolean gem_disable = getenv("INTEL_NO_GEM") != NULL; | |||
int gem_kernel = 0; | |||
GLboolean gem_supported; | |||
struct drm_i915_getparam gp; | |||
@@ -622,43 +621,24 @@ intel_init_bufmgr(intelScreenPrivate *intelScreen) | |||
/* If we've got a new enough DDX that's initializing GEM and giving us | |||
* object handles for the shared buffers, use that. | |||
*/ | |||
intelScreen->ttm = GL_FALSE; | |||
if (intelScreen->driScrnPriv->dri2.enabled) | |||
gem_supported = GL_TRUE; | |||
else if (intelScreen->driScrnPriv->ddx_version.minor >= 9 && | |||
gem_kernel && | |||
intelScreen->front.bo_handle != -1) | |||
gem_supported = GL_TRUE; | |||
else | |||
gem_supported = GL_FALSE; | |||
if (!gem_disable && gem_supported) { | |||
intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ); | |||
if (intelScreen->bufmgr != NULL) | |||
intelScreen->ttm = GL_TRUE; | |||
else { | |||
fprintf(stderr, "[%s:%u] Error initializing GEM.\n", | |||
__func__, __LINE__); | |||
return GL_FALSE; | |||
} | |||
intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ); | |||
/* Otherwise, use the classic buffer manager. */ | |||
if (intelScreen->bufmgr == NULL) { | |||
if (gem_disable) { | |||
_mesa_warning(NULL, "GEM disabled. Using classic."); | |||
} else { | |||
_mesa_warning(NULL, | |||
"Failed to initialize GEM. Falling back to classic."); | |||
} | |||
if (intelScreen->tex.size == 0) { | |||
fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n", | |||
__func__, __LINE__); | |||
return GL_FALSE; | |||
} | |||
intelScreen->bufmgr = | |||
intel_bufmgr_fake_init(spriv->fd, | |||
intelScreen->tex.offset, | |||
intelScreen->tex.map, | |||
intelScreen->tex.size, | |||
(unsigned int * volatile) | |||
&intelScreen->sarea->last_dispatch); | |||
fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n", | |||
__func__, __LINE__); | |||
return GL_FALSE; | |||
} | |||
if (intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences)) |
@@ -77,7 +77,6 @@ typedef struct | |||
GLboolean no_hw; | |||
GLboolean no_vbo; | |||
int ttm; | |||
dri_bufmgr *bufmgr; | |||
GLboolean kernel_exec_fencing; | |||
@@ -613,15 +613,7 @@ intel_set_span_functions(struct intel_context *intel, | |||
struct gl_renderbuffer *rb) | |||
{ | |||
struct intel_renderbuffer *irb = (struct intel_renderbuffer *) rb; | |||
uint32_t tiling; | |||
/* If in GEM mode, we need to do the tile address swizzling ourselves, | |||
* instead of the fence registers handling it. | |||
*/ | |||
if (intel->ttm) | |||
tiling = irb->region->tiling; | |||
else | |||
tiling = I915_TILING_NONE; | |||
uint32_t tiling = irb->region->tiling; | |||
if (intel->intelScreen->kernel_exec_fencing) { | |||
switch (irb->texformat) { | |||
@@ -673,6 +665,9 @@ intel_set_span_functions(struct intel_context *intel, | |||
return; | |||
} | |||
/* If in GEM mode, we need to do the tile address swizzling ourselves, | |||
* instead of the fence registers handling it. | |||
*/ | |||
switch (irb->texformat) { | |||
case MESA_FORMAT_RGB565: | |||
switch (tiling) { |
@@ -196,25 +196,6 @@ intel_translate_logic_op(GLenum opcode) | |||
} | |||
} | |||
static void | |||
intelClearColor(GLcontext *ctx, const GLfloat color[4]) | |||
{ | |||
struct intel_context *intel = intel_context(ctx); | |||
GLubyte clear[4]; | |||
CLAMPED_FLOAT_TO_UBYTE(clear[0], color[0]); | |||
CLAMPED_FLOAT_TO_UBYTE(clear[1], color[1]); | |||
CLAMPED_FLOAT_TO_UBYTE(clear[2], color[2]); | |||
CLAMPED_FLOAT_TO_UBYTE(clear[3], color[3]); | |||
/* compute both 32 and 16-bit clear values */ | |||
intel->ClearColor8888 = INTEL_PACKCOLOR8888(clear[0], clear[1], | |||
clear[2], clear[3]); | |||
intel->ClearColor565 = INTEL_PACKCOLOR565(clear[0], clear[1], clear[2]); | |||
} | |||
/* Fallback to swrast for select and feedback. | |||
*/ | |||
static void | |||
@@ -229,5 +210,4 @@ void | |||
intelInitStateFuncs(struct dd_function_table *functions) | |||
{ | |||
functions->RenderMode = intelRenderMode; | |||
functions->ClearColor = intelClearColor; | |||
} |
@@ -207,19 +207,19 @@ INTERP_QUALIFIER void TAG(interp_extras)( GLcontext *ctx, | |||
LOCALVARS | |||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; | |||
if (VB->ColorPtr[1]) { | |||
assert(VB->ColorPtr[1]->stride == 4 * sizeof(GLfloat)); | |||
if (VB->BackfaceColorPtr) { | |||
assert(VB->BackfaceColorPtr->stride == 4 * sizeof(GLfloat)); | |||
INTERP_4F( t, | |||
GET_COLOR(VB->ColorPtr[1], dst), | |||
GET_COLOR(VB->ColorPtr[1], out), | |||
GET_COLOR(VB->ColorPtr[1], in) ); | |||
GET_COLOR(VB->BackfaceColorPtr, dst), | |||
GET_COLOR(VB->BackfaceColorPtr, out), | |||
GET_COLOR(VB->BackfaceColorPtr, in) ); | |||
if (VB->SecondaryColorPtr[1]) { | |||
if (VB->BackfaceSecondaryColorPtr) { | |||
INTERP_3F( t, | |||
GET_COLOR(VB->SecondaryColorPtr[1], dst), | |||
GET_COLOR(VB->SecondaryColorPtr[1], out), | |||
GET_COLOR(VB->SecondaryColorPtr[1], in) ); | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, dst), | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, out), | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, in) ); | |||
} | |||
} | |||
@@ -236,13 +236,13 @@ INTERP_QUALIFIER void TAG(copy_pv_extras)( GLcontext *ctx, | |||
LOCALVARS | |||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; | |||
if (VB->ColorPtr[1]) { | |||
COPY_4FV( GET_COLOR(VB->ColorPtr[1], dst), | |||
GET_COLOR(VB->ColorPtr[1], src) ); | |||
if (VB->BackfaceColorPtr) { | |||
COPY_4FV( GET_COLOR(VB->BackfaceColorPtr, dst), | |||
GET_COLOR(VB->BackfaceColorPtr, src) ); | |||
if (VB->SecondaryColorPtr[1]) { | |||
COPY_4FV( GET_COLOR(VB->SecondaryColorPtr[1], dst), | |||
GET_COLOR(VB->SecondaryColorPtr[1], src) ); | |||
if (VB->BackfaceSecondaryColorPtr) { | |||
COPY_4FV( GET_COLOR(VB->BackfaceSecondaryColorPtr, dst), | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, src) ); | |||
} | |||
} | |||
@@ -103,10 +103,10 @@ static void TAG(emit)( GLcontext *ctx, | |||
#if DO_TEX1 | |||
{ | |||
const GLuint t1 = GET_TEXSOURCE(1); | |||
tc1 = VB->TexCoordPtr[t1]->data; | |||
tc1_stride = VB->TexCoordPtr[t1]->stride; | |||
tc1 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->data; | |||
tc1_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->stride; | |||
#if DO_PTEX | |||
tc1_size = VB->TexCoordPtr[t1]->size; | |||
tc1_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->size; | |||
#endif | |||
} | |||
#endif | |||
@@ -114,18 +114,18 @@ static void TAG(emit)( GLcontext *ctx, | |||
#if DO_TEX0 | |||
{ | |||
const GLuint t0 = GET_TEXSOURCE(0); | |||
tc0 = VB->TexCoordPtr[t0]->data; | |||
tc0_stride = VB->TexCoordPtr[t0]->stride; | |||
tc0 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->data; | |||
tc0_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->stride; | |||
#if DO_PTEX | |||
tc0_size = VB->TexCoordPtr[t0]->size; | |||
tc0_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->size; | |||
#endif | |||
} | |||
#endif | |||
#if DO_SPEC | |||
if (VB->SecondaryColorPtr[0]) { | |||
spec = VB->SecondaryColorPtr[0]->data; | |||
spec_stride = VB->SecondaryColorPtr[0]->stride; | |||
if (VB->AttribPtr[_TNL_ATTRIB_COLOR1]) { | |||
spec = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->data; | |||
spec_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->stride; | |||
} else { | |||
spec = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR1]; | |||
spec_stride = 0; | |||
@@ -133,9 +133,9 @@ static void TAG(emit)( GLcontext *ctx, | |||
#endif | |||
#if DO_FOG | |||
if (VB->FogCoordPtr) { | |||
fog = VB->FogCoordPtr->data; | |||
fog_stride = VB->FogCoordPtr->stride; | |||
if (VB->AttribPtr[_TNL_ATTRIB_FOG]) { | |||
fog = VB->AttribPtr[_TNL_ATTRIB_FOG]->data; | |||
fog_stride = VB->AttribPtr[_TNL_ATTRIB_FOG]->stride; | |||
} else { | |||
static GLfloat tmp[4] = {0, 0, 0, 0}; | |||
fog = &tmp; | |||
@@ -144,8 +144,8 @@ static void TAG(emit)( GLcontext *ctx, | |||
#endif | |||
#if DO_RGBA | |||
col = VB->ColorPtr[0]->data; | |||
col_stride = VB->ColorPtr[0]->stride; | |||
col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; | |||
col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; | |||
#endif | |||
coord = VB->NdcPtr->data; | |||
@@ -319,8 +319,8 @@ static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) | |||
/* Force 'missing' texcoords to something valid. | |||
*/ | |||
if (DO_TEX1 && VB->TexCoordPtr[0] == 0) | |||
VB->TexCoordPtr[0] = VB->TexCoordPtr[1]; | |||
if (DO_TEX1 && VB->AttribPtr[_TNL_ATTRIB_TEX0] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0] = VB->AttribPtr[_TNL_ATTRIB_TEX1]; | |||
if (DO_PTEX) | |||
return GL_TRUE; | |||
@@ -328,12 +328,12 @@ static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) | |||
/* No hardware support for projective texture. Can fake it for | |||
* TEX0 only. | |||
*/ | |||
if ((DO_TEX1 && VB->TexCoordPtr[GET_TEXSOURCE(1)]->size == 4)) { | |||
if ((DO_TEX1 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(1)]->size == 4)) { | |||
PTEX_FALLBACK(); | |||
return GL_FALSE; | |||
} | |||
if (DO_TEX0 && VB->TexCoordPtr[GET_TEXSOURCE(0)]->size == 4) { | |||
if (DO_TEX0 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(0)]->size == 4) { | |||
if (DO_TEX1) { | |||
PTEX_FALLBACK(); | |||
} |
@@ -156,53 +156,53 @@ static void TAG(emit)( GLcontext *ctx, | |||
if (DO_TEX3) { | |||
const GLuint t3 = GET_TEXSOURCE(3); | |||
tc3 = VB->TexCoordPtr[t3]->data; | |||
tc3_stride = VB->TexCoordPtr[t3]->stride; | |||
tc3 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t3]->data; | |||
tc3_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t3]->stride; | |||
if (DO_PTEX) | |||
tc3_size = VB->TexCoordPtr[t3]->size; | |||
tc3_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t3]->size; | |||
} | |||
if (DO_TEX2) { | |||
const GLuint t2 = GET_TEXSOURCE(2); | |||
tc2 = VB->TexCoordPtr[t2]->data; | |||
tc2_stride = VB->TexCoordPtr[t2]->stride; | |||
tc2 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->data; | |||
tc2_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->stride; | |||
if (DO_PTEX) | |||
tc2_size = VB->TexCoordPtr[t2]->size; | |||
tc2_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->size; | |||
} | |||
if (DO_TEX1) { | |||
const GLuint t1 = GET_TEXSOURCE(1); | |||
tc1 = VB->TexCoordPtr[t1]->data; | |||
tc1_stride = VB->TexCoordPtr[t1]->stride; | |||
tc1 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->data; | |||
tc1_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->stride; | |||
if (DO_PTEX) | |||
tc1_size = VB->TexCoordPtr[t1]->size; | |||
tc1_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->size; | |||
} | |||
if (DO_TEX0) { | |||
const GLuint t0 = GET_TEXSOURCE(0); | |||
tc0_stride = VB->TexCoordPtr[t0]->stride; | |||
tc0 = VB->TexCoordPtr[t0]->data; | |||
tc0_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->stride; | |||
tc0 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->data; | |||
if (DO_PTEX) | |||
tc0_size = VB->TexCoordPtr[t0]->size; | |||
tc0_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->size; | |||
} | |||
if (DO_RGBA) { | |||
col = VB->ColorPtr[0]->data; | |||
col_stride = VB->ColorPtr[0]->stride; | |||
col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; | |||
col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; | |||
} | |||
if (DO_SPEC) { | |||
spec = VB->SecondaryColorPtr[0]->data; | |||
spec_stride = VB->SecondaryColorPtr[0]->stride; | |||
spec = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->data; | |||
spec_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->stride; | |||
} else { | |||
spec = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR1]; | |||
spec_stride = 0; | |||
} | |||
if (DO_FOG) { | |||
if (VB->FogCoordPtr) { | |||
fog = VB->FogCoordPtr->data; | |||
fog_stride = VB->FogCoordPtr->stride; | |||
if (VB->AttribPtr[_TNL_ATTRIB_FOG]) { | |||
fog = VB->AttribPtr[_TNL_ATTRIB_FOG]->data; | |||
fog_stride = VB->AttribPtr[_TNL_ATTRIB_FOG]->stride; | |||
} else { | |||
static GLfloat tmp[4] = {0, 0, 0, 0}; | |||
fog = &tmp; | |||
@@ -384,8 +384,8 @@ static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, | |||
ASSERT(stride == 4); | |||
col = VB->ColorPtr[0]->data; | |||
col_stride = VB->ColorPtr[0]->stride; | |||
col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; | |||
col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; | |||
/* Pack what's left into a 4-dword vertex. Color is in a different | |||
* place, and there is no 'w' coordinate. | |||
@@ -432,8 +432,8 @@ static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, | |||
GLfloat *v = (GLfloat *)dest; | |||
int i; | |||
col = VB->ColorPtr[0]->data; | |||
col_stride = VB->ColorPtr[0]->stride; | |||
col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; | |||
col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; | |||
if (start) | |||
STRIDE_4F(col, col_stride * start); | |||
@@ -473,22 +473,22 @@ static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) | |||
/* Force 'missing' texcoords to something valid. | |||
*/ | |||
if (DO_TEX3 && VB->TexCoordPtr[2] == 0) | |||
VB->TexCoordPtr[2] = VB->TexCoordPtr[3]; | |||
if (DO_TEX3 && VB->AttribPtr[_TNL_ATTRIB_TEX2] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX2] = VB->AttribPtr[_TNL_ATTRIB_TEX3]; | |||
if (DO_TEX2 && VB->TexCoordPtr[1] == 0) | |||
VB->TexCoordPtr[1] = VB->TexCoordPtr[2]; | |||
if (DO_TEX2 && VB->AttribPtr[_TNL_ATTRIB_TEX1] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX1] = VB->AttribPtr[_TNL_ATTRIB_TEX2]; | |||
if (DO_TEX1 && VB->TexCoordPtr[0] == 0) | |||
VB->TexCoordPtr[0] = VB->TexCoordPtr[1]; | |||
if (DO_TEX1 && VB->AttribPtr[_TNL_ATTRIB_TEX0] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0] = VB->AttribPtr[_TNL_ATTRIB_TEX1]; | |||
if (DO_PTEX) | |||
return GL_TRUE; | |||
if ((DO_TEX3 && VB->TexCoordPtr[GET_TEXSOURCE(3)]->size == 4) || | |||
(DO_TEX2 && VB->TexCoordPtr[GET_TEXSOURCE(2)]->size == 4) || | |||
(DO_TEX1 && VB->TexCoordPtr[GET_TEXSOURCE(1)]->size == 4) || | |||
(DO_TEX0 && VB->TexCoordPtr[GET_TEXSOURCE(0)]->size == 4)) | |||
if ((DO_TEX3 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(3)]->size == 4) || | |||
(DO_TEX2 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(2)]->size == 4) || | |||
(DO_TEX1 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(1)]->size == 4) || | |||
(DO_TEX0 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(0)]->size == 4)) | |||
return GL_FALSE; | |||
return GL_TRUE; | |||
@@ -501,14 +501,14 @@ static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) | |||
/* Force 'missing' texcoords to something valid. | |||
*/ | |||
if (DO_TEX3 && VB->TexCoordPtr[2] == 0) | |||
VB->TexCoordPtr[2] = VB->TexCoordPtr[3]; | |||
if (DO_TEX3 && VB->AttribPtr[_TNL_ATTRIB_TEX2] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX2] = VB->AttribPtr[_TNL_ATTRIB_TEX3]; | |||
if (DO_TEX2 && VB->TexCoordPtr[1] == 0) | |||
VB->TexCoordPtr[1] = VB->TexCoordPtr[2]; | |||
if (DO_TEX2 && VB->AttribPtr[_TNL_ATTRIB_TEX1] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX1] = VB->AttribPtr[_TNL_ATTRIB_TEX2]; | |||
if (DO_TEX1 && VB->TexCoordPtr[0] == 0) | |||
VB->TexCoordPtr[0] = VB->TexCoordPtr[1]; | |||
if (DO_TEX1 && VB->AttribPtr[_TNL_ATTRIB_TEX0] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0] = VB->AttribPtr[_TNL_ATTRIB_TEX1]; | |||
if (DO_PTEX) | |||
return GL_TRUE; | |||
@@ -516,14 +516,14 @@ static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) | |||
/* No hardware support for projective texture. Can fake it for | |||
* TEX0 only. | |||
*/ | |||
if ((DO_TEX3 && VB->TexCoordPtr[GET_TEXSOURCE(3)]->size == 4) || | |||
(DO_TEX2 && VB->TexCoordPtr[GET_TEXSOURCE(2)]->size == 4) || | |||
(DO_TEX1 && VB->TexCoordPtr[GET_TEXSOURCE(1)]->size == 4)) { | |||
if ((DO_TEX3 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(3)]->size == 4) || | |||
(DO_TEX2 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(2)]->size == 4) || | |||
(DO_TEX1 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(1)]->size == 4)) { | |||
PTEX_FALLBACK(); | |||
return GL_FALSE; | |||
} | |||
if (DO_TEX0 && VB->TexCoordPtr[GET_TEXSOURCE(0)]->size == 4) { | |||
if (DO_TEX0 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(0)]->size == 4) { | |||
if (DO_TEX1 || DO_TEX2 || DO_TEX3) { | |||
PTEX_FALLBACK(); | |||
} |
@@ -650,12 +650,12 @@ static void r128RenderStart( GLcontext *ctx ) | |||
} | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(rmesa->tmu_source[0]) )) { | |||
if ( VB->TexCoordPtr[rmesa->tmu_source[0]]->size > 2 ) | |||
if ( VB->AttribPtr[_TNL_ATTRIB_TEX0 + rmesa->tmu_source[0]]->size > 2 ) | |||
fallback_projtex = GL_TRUE; | |||
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_2F, R128_CCE_VC_FRMT_S_T, 8 ); | |||
} | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(rmesa->tmu_source[1]) )) { | |||
if ( VB->TexCoordPtr[rmesa->tmu_source[1]]->size > 2 ) | |||
if ( VB->AttribPtr[_TNL_ATTRIB_TEX0 + rmesa->tmu_source[1]]->size > 2 ) | |||
fallback_projtex = GL_TRUE; | |||
EMIT_ATTR( _TNL_ATTRIB_TEX1, EMIT_2F, R128_CCE_VC_FRMT_S2_T2, 8 ); | |||
} |
@@ -168,7 +168,7 @@ static void r200SetVertexFormat( GLcontext *ctx ) | |||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(i) )) { | |||
GLuint sz = VB->TexCoordPtr[i]->size; | |||
GLuint sz = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size; | |||
fmt_1 |= sz << (3 * i); | |||
EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_1F + sz - 1, 0 ); |
@@ -124,7 +124,7 @@ void r300ChooseSwtclVertexFormat(GLcontext *ctx, GLuint *_InputsRead, GLuint *_ | |||
} | |||
if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) { | |||
VB->AttribPtr[VERT_ATTRIB_GENERIC0] = VB->ColorPtr[1]; | |||
VB->AttribPtr[VERT_ATTRIB_GENERIC0] = VB->BackfaceColorPtr; | |||
OutputsWritten |= 1 << VERT_RESULT_BFC0; | |||
#if MESA_LITTLE_ENDIAN | |||
EMIT_ATTR( _TNL_ATTRIB_GENERIC0, EMIT_4UB_4F_RGBA ); | |||
@@ -134,7 +134,7 @@ void r300ChooseSwtclVertexFormat(GLcontext *ctx, GLuint *_InputsRead, GLuint *_ | |||
ADD_ATTR(VERT_ATTRIB_GENERIC0, R300_DATA_TYPE_BYTE, SWTCL_OVM_COLOR2, SWIZZLE_XYZW, MASK_XYZW, 1); | |||
#endif | |||
if (fp_reads & FRAG_BIT_COL1) { | |||
VB->AttribPtr[VERT_ATTRIB_GENERIC1] = VB->SecondaryColorPtr[1]; | |||
VB->AttribPtr[VERT_ATTRIB_GENERIC1] = VB->BackfaceSecondaryColorPtr; | |||
GLuint swiz = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ONE); | |||
OutputsWritten |= 1 << VERT_RESULT_BFC1; | |||
#if MESA_LITTLE_ENDIAN | |||
@@ -159,7 +159,7 @@ void r300ChooseSwtclVertexFormat(GLcontext *ctx, GLuint *_InputsRead, GLuint *_ | |||
int tex_id = rmesa->selected_fp->wpos_attr - FRAG_ATTRIB_TEX0; | |||
VB->AttribPtr[VERT_ATTRIB_TEX0 + tex_id] = VB->AttribPtr[VERT_ATTRIB_POS]; | |||
VB->TexCoordPtr[tex_id] = VB->AttribPtr[VERT_ATTRIB_POS]; | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + tex_id] = VB->AttribPtr[VERT_ATTRIB_POS]; | |||
RENDERINPUTS_SET(tnl->render_inputs_bitset, _TNL_ATTRIB_TEX0 + tex_id); | |||
} | |||
@@ -167,7 +167,7 @@ void r300ChooseSwtclVertexFormat(GLcontext *ctx, GLuint *_InputsRead, GLuint *_ | |||
int tex_id = rmesa->selected_fp->fog_attr - FRAG_ATTRIB_TEX0; | |||
VB->AttribPtr[VERT_ATTRIB_TEX0 + tex_id] = VB->AttribPtr[VERT_ATTRIB_FOG]; | |||
VB->TexCoordPtr[tex_id] = VB->AttribPtr[VERT_ATTRIB_FOG]; | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + tex_id] = VB->AttribPtr[VERT_ATTRIB_FOG]; | |||
RENDERINPUTS_SET(tnl->render_inputs_bitset, _TNL_ATTRIB_TEX0 + tex_id); | |||
} | |||
@@ -180,7 +180,7 @@ void r300ChooseSwtclVertexFormat(GLcontext *ctx, GLuint *_InputsRead, GLuint *_ | |||
GLuint swiz, format, hw_format; | |||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { | |||
if (fp_reads & FRAG_BIT_TEX(i)) { | |||
switch (VB->TexCoordPtr[i]->size) { | |||
switch (VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size) { | |||
case 1: | |||
format = EMIT_1F; | |||
hw_format = R300_DATA_TYPE_FLOAT_1; |
@@ -196,12 +196,12 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) | |||
if (!rmesa->tcl.obj.buf) | |||
rcommon_emit_vector( ctx, | |||
&(rmesa->tcl.aos[nr]), | |||
(char *)VB->ObjPtr->data, | |||
VB->ObjPtr->size, | |||
VB->ObjPtr->stride, | |||
(char *)VB->AttribPtr[_TNL_ATTRIB_POS]->data, | |||
VB->AttribPtr[_TNL_ATTRIB_POS]->size, | |||
VB->AttribPtr[_TNL_ATTRIB_POS]->stride, | |||
count); | |||
switch( VB->ObjPtr->size ) { | |||
switch( VB->AttribPtr[_TNL_ATTRIB_POS]->size ) { | |||
case 4: vfmt |= RADEON_CP_VC_FRMT_W0; | |||
case 3: vfmt |= RADEON_CP_VC_FRMT_Z; | |||
case 2: vfmt |= RADEON_CP_VC_FRMT_XY; | |||
@@ -216,9 +216,9 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) | |||
if (!rmesa->tcl.norm.buf) | |||
rcommon_emit_vector( ctx, | |||
&(rmesa->tcl.aos[nr]), | |||
(char *)VB->NormalPtr->data, | |||
(char *)VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data, | |||
3, | |||
VB->NormalPtr->stride, | |||
VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride, | |||
count); | |||
vfmt |= RADEON_CP_VC_FRMT_N0; | |||
@@ -227,9 +227,9 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) | |||
if (inputs & VERT_BIT_COLOR0) { | |||
int emitsize; | |||
if (VB->ColorPtr[0]->size == 4 && | |||
(VB->ColorPtr[0]->stride != 0 || | |||
VB->ColorPtr[0]->data[0][3] != 1.0)) { | |||
if (VB->AttribPtr[_TNL_ATTRIB_COLOR0]->size == 4 && | |||
(VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride != 0 || | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data[0][3] != 1.0)) { | |||
vfmt |= RADEON_CP_VC_FRMT_FPCOLOR | RADEON_CP_VC_FRMT_FPALPHA; | |||
emitsize = 4; | |||
} | |||
@@ -242,9 +242,9 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) | |||
if (!rmesa->tcl.rgba.buf) | |||
rcommon_emit_vector( ctx, | |||
&(rmesa->tcl.aos[nr]), | |||
(char *)VB->ColorPtr[0]->data, | |||
(char *)VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data, | |||
emitsize, | |||
VB->ColorPtr[0]->stride, | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride, | |||
count); | |||
nr++; | |||
@@ -256,9 +256,9 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) | |||
rcommon_emit_vector( ctx, | |||
&(rmesa->tcl.aos[nr]), | |||
(char *)VB->SecondaryColorPtr[0]->data, | |||
(char *)VB->AttribPtr[_TNL_ATTRIB_COLOR1]->data, | |||
3, | |||
VB->SecondaryColorPtr[0]->stride, | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR1]->stride, | |||
count); | |||
} | |||
@@ -273,8 +273,8 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) | |||
if (!rmesa->tcl.fog.buf) | |||
emit_vecfog( ctx, | |||
&(rmesa->tcl.aos[nr]), | |||
(char *)VB->FogCoordPtr->data, | |||
VB->FogCoordPtr->stride, | |||
(char *)VB->AttribPtr[_TNL_ATTRIB_FOG]->data, | |||
VB->AttribPtr[_TNL_ATTRIB_FOG]->stride, | |||
count); | |||
vfmt |= RADEON_CP_VC_FRMT_FPFOG; | |||
@@ -290,24 +290,24 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) | |||
if (!rmesa->tcl.tex[unit].buf) | |||
emit_tex_vector( ctx, | |||
&(rmesa->tcl.aos[nr]), | |||
(char *)VB->TexCoordPtr[unit]->data, | |||
VB->TexCoordPtr[unit]->size, | |||
VB->TexCoordPtr[unit]->stride, | |||
(char *)VB->AttribPtr[_TNL_ATTRIB_TEX0 + unit]->data, | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + unit]->size, | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + unit]->stride, | |||
count ); | |||
nr++; | |||
vfmt |= RADEON_ST_BIT(unit); | |||
/* assume we need the 3rd coord if texgen is active for r/q OR at least | |||
3 coords are submitted. This may not be 100% correct */ | |||
if (VB->TexCoordPtr[unit]->size >= 3) { | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX0 + unit]->size >= 3) { | |||
vtx |= RADEON_Q_BIT(unit); | |||
vfmt |= RADEON_Q_BIT(unit); | |||
} | |||
if ( (ctx->Texture.Unit[unit].TexGenEnabled & (R_BIT | Q_BIT)) ) | |||
vtx |= RADEON_Q_BIT(unit); | |||
else if ((VB->TexCoordPtr[unit]->size >= 3) && | |||
else if ((VB->AttribPtr[_TNL_ATTRIB_TEX0 + unit]->size >= 3) && | |||
((ctx->Texture.Unit[unit]._ReallyEnabled & (TEXTURE_CUBE_BIT)) == 0)) { | |||
GLuint swaptexmatcol = (VB->TexCoordPtr[unit]->size - 3); | |||
GLuint swaptexmatcol = (VB->AttribPtr[_TNL_ATTRIB_TEX0 + unit]->size - 3); | |||
if (((rmesa->NeedTexMatrix >> unit) & 1) && | |||
(swaptexmatcol != ((rmesa->TexMatColSwap >> unit) & 1))) | |||
radeonUploadTexMatrix( rmesa, unit, swaptexmatcol ) ; |
@@ -56,18 +56,18 @@ static void TAG(emit)( GLcontext *ctx, | |||
radeon_print(RADEON_SWRENDER, RADEON_VERBOSE, "%s\n", __FUNCTION__); | |||
coord = (GLuint (*)[4])VB->ObjPtr->data; | |||
coord_stride = VB->ObjPtr->stride; | |||
coord = (GLuint (*)[4])VB->AttribPtr[_TNL_ATTRIB_POS]->data; | |||
coord_stride = VB->AttribPtr[_TNL_ATTRIB_POS]->stride; | |||
if (DO_TEX2) { | |||
if (VB->TexCoordPtr[2]) { | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX2]) { | |||
const GLuint t2 = GET_TEXSOURCE(2); | |||
tc2 = (GLuint (*)[4])VB->TexCoordPtr[t2]->data; | |||
tc2_stride = VB->TexCoordPtr[t2]->stride; | |||
if (DO_PTEX && VB->TexCoordPtr[t2]->size < 3) { | |||
tc2 = (GLuint (*)[4])VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->data; | |||
tc2_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->stride; | |||
if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->size < 3) { | |||
fill_tex |= (1<<2); | |||
} | |||
else if (DO_PTEX && VB->TexCoordPtr[t2]->size < 4) { | |||
else if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->size < 4) { | |||
rqcoordsnoswap |= (1<<2); | |||
} | |||
} else { | |||
@@ -77,14 +77,14 @@ static void TAG(emit)( GLcontext *ctx, | |||
} | |||
if (DO_TEX1) { | |||
if (VB->TexCoordPtr[1]) { | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX1]) { | |||
const GLuint t1 = GET_TEXSOURCE(1); | |||
tc1 = (GLuint (*)[4])VB->TexCoordPtr[t1]->data; | |||
tc1_stride = VB->TexCoordPtr[t1]->stride; | |||
if (DO_PTEX && VB->TexCoordPtr[t1]->size < 3) { | |||
tc1 = (GLuint (*)[4])VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->data; | |||
tc1_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->stride; | |||
if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->size < 3) { | |||
fill_tex |= (1<<1); | |||
} | |||
else if (DO_PTEX && VB->TexCoordPtr[t1]->size < 4) { | |||
else if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->size < 4) { | |||
rqcoordsnoswap |= (1<<1); | |||
} | |||
} else { | |||
@@ -94,14 +94,14 @@ static void TAG(emit)( GLcontext *ctx, | |||
} | |||
if (DO_TEX0) { | |||
if (VB->TexCoordPtr[0]) { | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX0]) { | |||
const GLuint t0 = GET_TEXSOURCE(0); | |||
tc0_stride = VB->TexCoordPtr[t0]->stride; | |||
tc0 = (GLuint (*)[4])VB->TexCoordPtr[t0]->data; | |||
if (DO_PTEX && VB->TexCoordPtr[t0]->size < 3) { | |||
tc0_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->stride; | |||
tc0 = (GLuint (*)[4])VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->data; | |||
if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->size < 3) { | |||
fill_tex |= (1<<0); | |||
} | |||
else if (DO_PTEX && VB->TexCoordPtr[t0]->size < 4) { | |||
else if (DO_PTEX && VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->size < 4) { | |||
rqcoordsnoswap |= (1<<0); | |||
} | |||
} else { | |||
@@ -112,9 +112,9 @@ static void TAG(emit)( GLcontext *ctx, | |||
} | |||
if (DO_NORM) { | |||
if (VB->NormalPtr) { | |||
norm_stride = VB->NormalPtr->stride; | |||
norm = (GLuint (*)[4])VB->NormalPtr->data; | |||
if (VB->AttribPtr[_TNL_ATTRIB_NORMAL]) { | |||
norm_stride = VB->AttribPtr[_TNL_ATTRIB_NORMAL]->stride; | |||
norm = (GLuint (*)[4])VB->AttribPtr[_TNL_ATTRIB_NORMAL]->data; | |||
} else { | |||
norm_stride = 0; | |||
norm = (GLuint (*)[4])&ctx->Current.Attrib[VERT_ATTRIB_NORMAL]; | |||
@@ -122,9 +122,9 @@ static void TAG(emit)( GLcontext *ctx, | |||
} | |||
if (DO_RGBA) { | |||
if (VB->ColorPtr[0]) { | |||
col = VB->ColorPtr[0]->data; | |||
col_stride = VB->ColorPtr[0]->stride; | |||
if (VB->AttribPtr[_TNL_ATTRIB_COLOR0]) { | |||
col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; | |||
col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; | |||
} else { | |||
col = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR0]; | |||
col_stride = 0; | |||
@@ -132,9 +132,9 @@ static void TAG(emit)( GLcontext *ctx, | |||
} | |||
if (DO_SPEC_OR_FOG) { | |||
if (VB->SecondaryColorPtr[0]) { | |||
spec = VB->SecondaryColorPtr[0]->data; | |||
spec_stride = VB->SecondaryColorPtr[0]->stride; | |||
if (VB->AttribPtr[_TNL_ATTRIB_COLOR1]) { | |||
spec = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->data; | |||
spec_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->stride; | |||
} else { | |||
spec = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR1]; | |||
spec_stride = 0; | |||
@@ -142,9 +142,9 @@ static void TAG(emit)( GLcontext *ctx, | |||
} | |||
if (DO_SPEC_OR_FOG) { | |||
if (VB->FogCoordPtr) { | |||
fog = VB->FogCoordPtr->data; | |||
fog_stride = VB->FogCoordPtr->stride; | |||
if (VB->AttribPtr[_TNL_ATTRIB_FOG]) { | |||
fog = VB->AttribPtr[_TNL_ATTRIB_FOG]->data; | |||
fog_stride = VB->AttribPtr[_TNL_ATTRIB_FOG]->stride; | |||
} else { | |||
fog = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_FOG]; | |||
fog_stride = 0; |
@@ -326,7 +326,7 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) | |||
if (1) { | |||
req |= RADEON_CP_VC_FRMT_Z; | |||
if (VB->ObjPtr->size == 4) { | |||
if (VB->AttribPtr[_TNL_ATTRIB_POS]->size == 4) { | |||
req |= RADEON_CP_VC_FRMT_W0; | |||
} | |||
} | |||
@@ -348,15 +348,15 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) | |||
req |= RADEON_ST_BIT(unit); | |||
/* assume we need the 3rd coord if texgen is active for r/q OR at least | |||
3 coords are submitted. This may not be 100% correct */ | |||
if (VB->TexCoordPtr[unit]->size >= 3) { | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX0 + unit]->size >= 3) { | |||
req |= RADEON_Q_BIT(unit); | |||
vtx |= RADEON_Q_BIT(unit); | |||
} | |||
if ( (ctx->Texture.Unit[unit].TexGenEnabled & (R_BIT | Q_BIT)) ) | |||
vtx |= RADEON_Q_BIT(unit); | |||
else if ((VB->TexCoordPtr[unit]->size >= 3) && | |||
else if ((VB->AttribPtr[_TNL_ATTRIB_TEX0 + unit]->size >= 3) && | |||
((ctx->Texture.Unit[unit]._ReallyEnabled & (TEXTURE_CUBE_BIT)) == 0)) { | |||
GLuint swaptexmatcol = (VB->TexCoordPtr[unit]->size - 3); | |||
GLuint swaptexmatcol = (VB->AttribPtr[_TNL_ATTRIB_TEX0 + unit]->size - 3); | |||
if (((rmesa->NeedTexMatrix >> unit) & 1) && | |||
(swaptexmatcol != ((rmesa->TexMatColSwap >> unit) & 1))) | |||
radeonUploadTexMatrix( rmesa, unit, swaptexmatcol ) ; | |||
@@ -390,19 +390,19 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) | |||
* this, add more vertex code (for obj-2, obj-3) or preferably move | |||
* to maos. | |||
*/ | |||
if (VB->ObjPtr->size < 3 || | |||
(VB->ObjPtr->size == 3 && | |||
if (VB->AttribPtr[_TNL_ATTRIB_POS]->size < 3 || | |||
(VB->AttribPtr[_TNL_ATTRIB_POS]->size == 3 && | |||
(setup_tab[i].vertex_format & RADEON_CP_VC_FRMT_W0))) { | |||
_math_trans_4f( rmesa->tcl.ObjClean.data, | |||
VB->ObjPtr->data, | |||
VB->ObjPtr->stride, | |||
VB->AttribPtr[_TNL_ATTRIB_POS]->data, | |||
VB->AttribPtr[_TNL_ATTRIB_POS]->stride, | |||
GL_FLOAT, | |||
VB->ObjPtr->size, | |||
VB->AttribPtr[_TNL_ATTRIB_POS]->size, | |||
0, | |||
VB->Count ); | |||
switch (VB->ObjPtr->size) { | |||
switch (VB->AttribPtr[_TNL_ATTRIB_POS]->size) { | |||
case 1: | |||
_mesa_vector4f_clean_elem(&rmesa->tcl.ObjClean, VB->Count, 1); | |||
case 2: | |||
@@ -416,7 +416,7 @@ void radeonEmitArrays( GLcontext *ctx, GLuint inputs ) | |||
break; | |||
} | |||
VB->ObjPtr = &rmesa->tcl.ObjClean; | |||
VB->AttribPtr[_TNL_ATTRIB_POS] = &rmesa->tcl.ObjClean; | |||
} | |||
@@ -179,7 +179,7 @@ static void radeonSetVertexFormat( GLcontext *ctx ) | |||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(i) )) { | |||
GLuint sz = VB->TexCoordPtr[i]->size; | |||
GLuint sz = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size; | |||
switch (sz) { | |||
case 1: |
@@ -252,13 +252,13 @@ static GLboolean run_texnorm_stage( GLcontext *ctx, | |||
const GLboolean normalizeS = (texObj->WrapS == GL_REPEAT); | |||
const GLboolean normalizeT = (reallyEnabled & TEXTURE_2D_BIT) && | |||
(texObj->WrapT == GL_REPEAT); | |||
const GLfloat *in = (GLfloat *)VB->TexCoordPtr[i]->data; | |||
const GLint instride = VB->TexCoordPtr[i]->stride; | |||
const GLfloat *in = (GLfloat *)VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->data; | |||
const GLint instride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->stride; | |||
GLfloat (*out)[4] = store->texcoord[i].data; | |||
GLint j; | |||
if (!ctx->Texture.Unit[i]._ReallyEnabled || | |||
VB->TexCoordPtr[i]->size == 4) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size == 4) | |||
/* Never try to normalize homogenous tex coords! */ | |||
continue; | |||
@@ -297,7 +297,7 @@ static GLboolean run_texnorm_stage( GLcontext *ctx, | |||
} | |||
if (normalizeS || normalizeT) | |||
VB->AttribPtr[VERT_ATTRIB_TEX0+i] = VB->TexCoordPtr[i] = &store->texcoord[i]; | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + i] = &store->texcoord[i]; | |||
} | |||
} | |||
@@ -879,13 +879,13 @@ static GLboolean savageCheckPTexHack( GLcontext *ctx ) | |||
RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset ); | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX0 ) && VB->TexCoordPtr[0]->size == 4) { | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX0 ) && VB->AttribPtr[_TNL_ATTRIB_TEX0]->size == 4) { | |||
if (!RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_ATTRIB_TEX1, _TNL_LAST_TEX )) | |||
return GL_TRUE; /* apply ptex hack */ | |||
else | |||
FALLBACK(ctx, SAVAGE_FALLBACK_PROJ_TEXTURE, GL_TRUE); | |||
} | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX1 ) && VB->TexCoordPtr[1]->size == 4) | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX1 ) && VB->AttribPtr[_TNL_ATTRIB_TEX1]->size == 4) | |||
FALLBACK(ctx, SAVAGE_FALLBACK_PROJ_TEXTURE, GL_TRUE); | |||
return GL_FALSE; /* don't apply ptex hack */ | |||
@@ -976,13 +976,13 @@ static INLINE GLuint savageChooseVertexFormat_s3d( GLcontext *ctx ) | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX0 )) { | |||
if (imesa->ptexHack) | |||
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_3F_XYW, SAVAGE_EMIT_STQ0, SAVAGE_SKIP_ST0); | |||
else if (VB->TexCoordPtr[0]->size == 4) | |||
else if (VB->AttribPtr[_TNL_ATTRIB_TEX0]->size == 4) | |||
assert (0); /* should be caught by savageCheckPTexHack */ | |||
else if (VB->TexCoordPtr[0]->size >= 2) | |||
else if (VB->AttribPtr[_TNL_ATTRIB_TEX0]->size >= 2) | |||
/* The chromium menu emits some 3D tex coords even though no | |||
* 3D texture is enabled. Ignore the 3rd coordinate. */ | |||
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_2F, SAVAGE_EMIT_ST0, SAVAGE_SKIP_ST0 ); | |||
else if (VB->TexCoordPtr[0]->size == 1) { | |||
else if (VB->AttribPtr[_TNL_ATTRIB_TEX0]->size == 1) { | |||
EMIT_ATTR( _TNL_ATTRIB_TEX0, EMIT_1F, SAVAGE_EMIT_S0, SAVAGE_SKIP_S0 ); | |||
EMIT_PAD( 4 ); | |||
} else | |||
@@ -1025,9 +1025,9 @@ static INLINE GLuint savageChooseVertexFormat_s4( GLcontext *ctx ) | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX0 )) { | |||
if (imesa->ptexHack) | |||
NEED_ATTR( SAVAGE_EMIT_STQ0, SAVAGE_SKIP_ST0); | |||
else if (VB->TexCoordPtr[0]->size == 4) | |||
else if (VB->AttribPtr[_TNL_ATTRIB_TEX0]->size == 4) | |||
assert (0); /* should be caught by savageCheckPTexHack */ | |||
else if (VB->TexCoordPtr[0]->size >= 2) | |||
else if (VB->AttribPtr[_TNL_ATTRIB_TEX0]->size >= 2) | |||
/* The chromium menu emits some 3D tex coords even though no | |||
* 3D texture is enabled. Ignore the 3rd coordinate. */ | |||
NEED_ATTR( SAVAGE_EMIT_ST0, SAVAGE_SKIP_ST0 ); | |||
@@ -1035,10 +1035,10 @@ static INLINE GLuint savageChooseVertexFormat_s4( GLcontext *ctx ) | |||
NEED_ATTR( SAVAGE_EMIT_S0, SAVAGE_SKIP_S0 ); | |||
} | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX1 )) { | |||
if (VB->TexCoordPtr[1]->size == 4) | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX1]->size == 4) | |||
/* projective textures are not supported by the hardware */ | |||
assert (0); /* should be caught by savageCheckPTexHack */ | |||
else if (VB->TexCoordPtr[1]->size >= 2) | |||
else if (VB->AttribPtr[_TNL_ATTRIB_TEX1]->size >= 2) | |||
NEED_ATTR( SAVAGE_EMIT_ST1, SAVAGE_SKIP_ST1 ); | |||
else | |||
NEED_ATTR( SAVAGE_EMIT_S1, SAVAGE_SKIP_S1 ); |
@@ -903,14 +903,14 @@ static void sisRenderStart( GLcontext *ctx ) | |||
/* projective textures are not supported by the hardware */ | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX0 )) { | |||
if (VB->TexCoordPtr[0]->size > 2) | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX0]->size > 2) | |||
tex_fallback = GL_TRUE; | |||
EMIT_ATTR(_TNL_ATTRIB_TEX0, EMIT_2F); | |||
AGPParseSet |= SiS_PS_HAS_UV0; | |||
} | |||
/* Will only hit tex1 on SiS300 */ | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX1 )) { | |||
if (VB->TexCoordPtr[1]->size > 2) | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX1]->size > 2) | |||
tex_fallback = GL_TRUE; | |||
EMIT_ATTR(_TNL_ATTRIB_TEX1, EMIT_2F); | |||
AGPParseSet |= SiS_PS_HAS_UV1; |
@@ -69,11 +69,11 @@ static void interp_extras( GLcontext *ctx, | |||
/*fprintf(stderr, "%s\n", __FUNCTION__);*/ | |||
if (VB->ColorPtr[1]) { | |||
if (VB->BackfaceColorPtr) { | |||
INTERP_4F( t, | |||
GET_COLOR(VB->ColorPtr[1], dst), | |||
GET_COLOR(VB->ColorPtr[1], out), | |||
GET_COLOR(VB->ColorPtr[1], in) ); | |||
GET_COLOR(VB->BackfaceColorPtr, dst), | |||
GET_COLOR(VB->BackfaceColorPtr, out), | |||
GET_COLOR(VB->BackfaceColorPtr, in) ); | |||
} | |||
if (VB->EdgeFlag) { | |||
@@ -88,9 +88,9 @@ static void copy_pv_extras( GLcontext *ctx, GLuint dst, GLuint src ) | |||
{ | |||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; | |||
if (VB->ColorPtr[1]) { | |||
COPY_4FV( GET_COLOR(VB->ColorPtr[1], dst), | |||
GET_COLOR(VB->ColorPtr[1], src) ); | |||
if (VB->BackfaceColorPtr) { | |||
COPY_4FV( GET_COLOR(VB->BackfaceColorPtr, dst), | |||
GET_COLOR(VB->BackfaceColorPtr, src) ); | |||
} | |||
setup_tab[TDFX_CONTEXT(ctx)->SetupIndex].copy_pv(ctx, dst, src); |
@@ -58,32 +58,32 @@ static void TAG(emit)( GLcontext *ctx, | |||
/* fprintf(stderr, "%s\n", __FUNCTION__); */ | |||
if (IND & TDFX_TEX0_BIT) { | |||
tc0_stride = VB->TexCoordPtr[tmu0_source]->stride; | |||
tc0 = VB->TexCoordPtr[tmu0_source]->data; | |||
tc0_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu0_source]->stride; | |||
tc0 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu0_source]->data; | |||
u0scale = fxMesa->sScale0; | |||
v0scale = fxMesa->tScale0; | |||
if (IND & TDFX_PTEX_BIT) | |||
tc0_size = VB->TexCoordPtr[tmu0_source]->size; | |||
tc0_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu0_source]->size; | |||
} | |||
if (IND & TDFX_TEX1_BIT) { | |||
tc1 = VB->TexCoordPtr[tmu1_source]->data; | |||
tc1_stride = VB->TexCoordPtr[tmu1_source]->stride; | |||
tc1 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu1_source]->data; | |||
tc1_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu1_source]->stride; | |||
u1scale = fxMesa->sScale1; | |||
v1scale = fxMesa->tScale1; | |||
if (IND & TDFX_PTEX_BIT) | |||
tc1_size = VB->TexCoordPtr[tmu1_source]->size; | |||
tc1_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu1_source]->size; | |||
} | |||
if (IND & TDFX_RGBA_BIT) { | |||
col = VB->ColorPtr[0]->data; | |||
col_stride = VB->ColorPtr[0]->stride; | |||
col_size = VB->ColorPtr[0]->size; | |||
col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; | |||
col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; | |||
col_size = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->size; | |||
} | |||
if (IND & TDFX_FOGC_BIT) { | |||
fog = VB->FogCoordPtr->data; | |||
fog_stride = VB->FogCoordPtr->stride; | |||
fog = VB->AttribPtr[_TNL_ATTRIB_FOG]->data; | |||
fog_stride = VB->AttribPtr[_TNL_ATTRIB_FOG]->stride; | |||
} | |||
{ | |||
@@ -168,14 +168,14 @@ static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) | |||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; | |||
if (IND & TDFX_TEX1_BIT) { | |||
if (VB->TexCoordPtr[0] == 0) | |||
VB->TexCoordPtr[0] = VB->TexCoordPtr[1]; | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX0] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0] = VB->AttribPtr[_TNL_ATTRIB_TEX1]; | |||
if (VB->TexCoordPtr[1]->size == 4) | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX1]->size == 4) | |||
return GL_FALSE; | |||
} | |||
if (VB->TexCoordPtr[0]->size == 4) | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX0]->size == 4) | |||
return GL_FALSE; | |||
} | |||
@@ -832,13 +832,13 @@ static GLboolean viaCheckPTexHack( GLcontext *ctx ) | |||
RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset ); | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX0 ) && VB->TexCoordPtr[0]->size == 4) { | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX0 ) && VB->AttribPtr[_TNL_ATTRIB_TEX0]->size == 4) { | |||
if (!RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_ATTRIB_TEX1, _TNL_LAST_TEX )) | |||
ptexHack = GL_TRUE; | |||
else | |||
fallback = GL_TRUE; | |||
} | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX1 ) && VB->TexCoordPtr[1]->size == 4) | |||
if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX1 ) && VB->AttribPtr[_TNL_ATTRIB_TEX1]->size == 4) | |||
fallback = GL_TRUE; | |||
FALLBACK(VIA_CONTEXT(ctx), VIA_FALLBACK_PROJ_TEXTURE, fallback); |
@@ -104,24 +104,24 @@ static void interp_extras( GLcontext *ctx, | |||
{ | |||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; | |||
if (VB->ColorPtr[1]) { | |||
/* If stride is zero, ColorPtr[1] is constant across the VB, so | |||
if (VB->BackfaceColorPtr) { | |||
/* If stride is zero, BackfaceColorPtr is constant across the VB, so | |||
* there is no point interpolating between two values as they will | |||
* be identical. This case is handled in t_dd_tritmp.h | |||
*/ | |||
if (VB->ColorPtr[1]->stride) { | |||
assert(VB->ColorPtr[1]->stride == 4 * sizeof(GLfloat)); | |||
if (VB->BackfaceColorPtr->stride) { | |||
assert(VB->BackfaceColorPtr->stride == 4 * sizeof(GLfloat)); | |||
INTERP_4F( t, | |||
GET_COLOR(VB->ColorPtr[1], dst), | |||
GET_COLOR(VB->ColorPtr[1], out), | |||
GET_COLOR(VB->ColorPtr[1], in) ); | |||
GET_COLOR(VB->BackfaceColorPtr, dst), | |||
GET_COLOR(VB->BackfaceColorPtr, out), | |||
GET_COLOR(VB->BackfaceColorPtr, in) ); | |||
} | |||
if (VB->SecondaryColorPtr[1]) { | |||
if (VB->BackfaceSecondaryColorPtr) { | |||
INTERP_3F( t, | |||
GET_COLOR(VB->SecondaryColorPtr[1], dst), | |||
GET_COLOR(VB->SecondaryColorPtr[1], out), | |||
GET_COLOR(VB->SecondaryColorPtr[1], in) ); | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, dst), | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, out), | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, in) ); | |||
} | |||
} | |||
@@ -137,13 +137,13 @@ static void copy_pv_extras( GLcontext *ctx, GLuint dst, GLuint src ) | |||
{ | |||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; | |||
if (VB->ColorPtr[1]) { | |||
COPY_4FV( GET_COLOR(VB->ColorPtr[1], dst), | |||
GET_COLOR(VB->ColorPtr[1], src) ); | |||
if (VB->BackfaceColorPtr) { | |||
COPY_4FV( GET_COLOR(VB->BackfaceColorPtr, dst), | |||
GET_COLOR(VB->BackfaceColorPtr, src) ); | |||
if (VB->SecondaryColorPtr[1]) { | |||
COPY_3FV( GET_COLOR(VB->SecondaryColorPtr[1], dst), | |||
GET_COLOR(VB->SecondaryColorPtr[1], src) ); | |||
if (VB->BackfaceSecondaryColorPtr) { | |||
COPY_3FV( GET_COLOR(VB->BackfaceSecondaryColorPtr, dst), | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, src) ); | |||
} | |||
} | |||
@@ -62,37 +62,37 @@ static void TAG(emit)( GLcontext *ctx, | |||
} | |||
if (IND & SETUP_TMU0) { | |||
tc0 = VB->TexCoordPtr[tmu0_source]->data; | |||
tc0_stride = VB->TexCoordPtr[tmu0_source]->stride; | |||
tc0 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu0_source]->data; | |||
tc0_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu0_source]->stride; | |||
u0scale = fxMesa->s0scale; | |||
v0scale = fxMesa->t0scale; | |||
if (IND & SETUP_PTEX) | |||
tc0_size = VB->TexCoordPtr[tmu0_source]->size; | |||
tc0_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu0_source]->size; | |||
} | |||
if (IND & SETUP_TMU1) { | |||
tc1 = VB->TexCoordPtr[tmu1_source]->data; | |||
tc1_stride = VB->TexCoordPtr[tmu1_source]->stride; | |||
tc1 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu1_source]->data; | |||
tc1_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu1_source]->stride; | |||
u1scale = fxMesa->s1scale; /* wrong if tmu1_source == 0, possible? */ | |||
v1scale = fxMesa->t1scale; | |||
if (IND & SETUP_PTEX) | |||
tc1_size = VB->TexCoordPtr[tmu1_source]->size; | |||
tc1_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + tmu1_source]->size; | |||
} | |||
if (IND & SETUP_RGBA) { | |||
col = VB->ColorPtr[0]->data; | |||
col_stride = VB->ColorPtr[0]->stride; | |||
col_size = VB->ColorPtr[0]->size; | |||
col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; | |||
col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; | |||
col_size = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->size; | |||
} | |||
if (IND & SETUP_SPEC) { | |||
spec = VB->SecondaryColorPtr[0]->data; | |||
spec_stride = VB->SecondaryColorPtr[0]->stride; | |||
spec = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->data; | |||
spec_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->stride; | |||
} | |||
if (IND & SETUP_FOGC) { | |||
fog = VB->FogCoordPtr->data; | |||
fog_stride = VB->FogCoordPtr->stride; | |||
fog = VB->AttribPtr[_TNL_ATTRIB_FOG]->data; | |||
fog_stride = VB->AttribPtr[_TNL_ATTRIB_FOG]->stride; | |||
} | |||
if (start) { | |||
@@ -220,14 +220,15 @@ static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) | |||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; | |||
if (IND & SETUP_TMU1) { | |||
if (VB->TexCoordPtr[0] == 0) | |||
VB->TexCoordPtr[0] = VB->TexCoordPtr[1]; | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX0] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0] = VB->AttribPtr[_TNL_ATTRIB_TEX1]; | |||
if (VB->TexCoordPtr[1]->size == 4) | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX1]->size == 4) | |||
return GL_FALSE; | |||
} | |||
if (VB->TexCoordPtr[0] && VB->TexCoordPtr[0]->size == 4) | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX0] && | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0]->size == 4) | |||
return GL_FALSE; | |||
} | |||
@@ -189,9 +189,9 @@ | |||
GLfloat ex,ey,fx,fy,cc; \ | |||
/* Get vars for later */ \ | |||
VB = &TNL_CONTEXT(ctx)->vb; \ | |||
vbcolor = (GLchan (*)[4])VB->ColorPtr[1]->data; \ | |||
if (VB->SecondaryColorPtr[1]) { \ | |||
vbspec = (GLchan (*)[4])VB->SecondaryColorPtr[1]->data; \ | |||
vbcolor = (GLchan (*)[4])VB->BackfaceColorPtr->data; \ | |||
if (VB->BackfaceSecondaryColorPtr) { \ | |||
vbspec = (GLchan (*)[4])VB->BackfaceSecondaryColorPtr->data; \ | |||
} else { \ | |||
vbspec = NULL; \ | |||
} \ | |||
@@ -241,33 +241,33 @@ | |||
DWORD dwColor; | |||
#define GLD_SETUP_3D_VERTEX(v) \ | |||
p4f = VB->ObjPtr->data; \ | |||
p4f = VB->AttribPtr[_TNL_ATTRIB_POS]->data; \ | |||
pV->Position.x = p4f[##v][0]; \ | |||
pV->Position.y = p4f[##v][1]; \ | |||
pV->Position.z = p4f[##v][2]; | |||
#define GLD_SETUP_SMOOTH_COLOUR_3D(v) \ | |||
p4f = (GLfloat (*)[4])VB->ColorPtr[0]->data; \ | |||
p4f = (GLfloat (*)[4])VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; \ | |||
pV->Diffuse = D3DCOLOR_COLORVALUE(p4f[##v][0], p4f[##v][1], p4f[##v][2], p4f[##v][3]); | |||
#define GLD_SETUP_GET_FLAT_COLOUR_3D(v) \ | |||
p4f = (GLfloat (*)[4])VB->ColorPtr[0]->data; \ | |||
p4f = (GLfloat (*)[4])VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; \ | |||
dwColor = D3DCOLOR_COLORVALUE(p4f[##v][0], p4f[##v][1], p4f[##v][2], p4f[##v][3]); | |||
#define GLD_SETUP_USE_FLAT_COLOUR_3D \ | |||
pV->Diffuse = dwColor; | |||
#define GLD_SETUP_TEX0_3D(v) \ | |||
if (VB->TexCoordPtr[0]) { \ | |||
tc = VB->TexCoordPtr[0]->data; \ | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX0]) { \ | |||
tc = VB->AttribPtr[_TNL_ATTRIB_TEX0]->data; \ | |||
pV->TexUnit0.x = tc[##v][0]; \ | |||
pV->TexUnit0.y = tc[##v][1]; \ | |||
} | |||
#define GLD_SETUP_TEX1_3D(v) \ | |||
if (VB->TexCoordPtr[1]) { \ | |||
tc = VB->TexCoordPtr[1]->data; \ | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX1]) { \ | |||
tc = VB->AttribPtr[_TNL_ATTRIB_TEX1]->data; \ | |||
pV->TexUnit1.x = tc[##v][0]; \ | |||
pV->TexUnit1.y = tc[##v][1]; \ | |||
} |
@@ -151,7 +151,7 @@ static GLboolean gld_d3d_render_stage_run( | |||
#if 0 | |||
// For debugging: Useful to see if an app passes colour data in | |||
// an unusual format. | |||
switch (VB->ColorPtr[0]->Type) { | |||
switch (VB->AttribPtr[_TNL_ATTRIB_COLOR0]->Type) { | |||
case GL_FLOAT: | |||
ddlogMessage(GLDLOG_SYSTEM, "ColorPtr: GL_FLOAT\n"); | |||
break; |
@@ -189,9 +189,9 @@ | |||
GLfloat ex,ey,fx,fy,cc; \ | |||
/* Get vars for later */ \ | |||
VB = &TNL_CONTEXT(ctx)->vb; \ | |||
vbcolor = (GLchan (*)[4])VB->ColorPtr[1]->data; \ | |||
if (VB->SecondaryColorPtr[1]) { \ | |||
vbspec = (GLchan (*)[4])VB->SecondaryColorPtr[1]->data; \ | |||
vbcolor = (GLchan (*)[4])VB->BackfaceColorPtr->data; \ | |||
if (VB->BackfaceSecondaryColorPtr) { \ | |||
vbspec = (GLchan (*)[4])VB->BackfaceSecondaryColorPtr->data; \ | |||
} else { \ | |||
vbspec = NULL; \ | |||
} \ | |||
@@ -241,33 +241,33 @@ | |||
DWORD dwColor; | |||
#define GLD_SETUP_3D_VERTEX(v) \ | |||
p4f = VB->ObjPtr->data; \ | |||
p4f = VB->AttribPtr[_TNL_ATTRIB_POS]->data; \ | |||
pV->Position.x = p4f[##v][0]; \ | |||
pV->Position.y = p4f[##v][1]; \ | |||
pV->Position.z = p4f[##v][2]; | |||
#define GLD_SETUP_SMOOTH_COLOUR_3D(v) \ | |||
p4f = (GLfloat (*)[4])VB->ColorPtr[0]->data; \ | |||
p4f = (GLfloat (*)[4])VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; \ | |||
pV->Diffuse = D3DCOLOR_COLORVALUE(p4f[##v][0], p4f[##v][1], p4f[##v][2], p4f[##v][3]); | |||
#define GLD_SETUP_GET_FLAT_COLOUR_3D(v) \ | |||
p4f = (GLfloat (*)[4])VB->ColorPtr[0]->data; \ | |||
p4f = (GLfloat (*)[4])VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; \ | |||
dwColor = D3DCOLOR_COLORVALUE(p4f[##v][0], p4f[##v][1], p4f[##v][2], p4f[##v][3]); | |||
#define GLD_SETUP_USE_FLAT_COLOUR_3D \ | |||
pV->Diffuse = dwColor; | |||
#define GLD_SETUP_TEX0_3D(v) \ | |||
if (VB->TexCoordPtr[0]) { \ | |||
tc = VB->TexCoordPtr[0]->data; \ | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX0]) { \ | |||
tc = VB->TnlAttribPtr[_TNL_ATTRIB_TEX0]->data; \ | |||
pV->TexUnit0.x = tc[##v][0]; \ | |||
pV->TexUnit0.y = tc[##v][1]; \ | |||
} | |||
#define GLD_SETUP_TEX1_3D(v) \ | |||
if (VB->TexCoordPtr[1]) { \ | |||
tc = VB->TexCoordPtr[1]->data; \ | |||
if (VB->TnlAttribPtr[_TNL_ATTRIB_TEX1]) { \ | |||
tc = VB->TnlAttribPtr[_TNL_ATTRIB_TEX1]->data; \ | |||
pV->TexUnit1.x = tc[##v][0]; \ | |||
pV->TexUnit1.y = tc[##v][1]; \ | |||
} |
@@ -149,7 +149,7 @@ static GLboolean gld_d3d_render_stage_run( | |||
#if 0 | |||
// For debugging: Useful to see if an app passes colour data in | |||
// an unusual format. | |||
switch (VB->ColorPtr[0]->Type) { | |||
switch (VB->AttribPtr[_TNL_ATTRIB_COLOR0]->Type) { | |||
case GL_FLOAT: | |||
ddlogMessage(GLDLOG_SYSTEM, "ColorPtr: GL_FLOAT\n"); | |||
break; |
@@ -189,9 +189,9 @@ | |||
GLfloat ex,ey,fx,fy,cc; \ | |||
/* Get vars for later */ \ | |||
VB = &TNL_CONTEXT(ctx)->vb; \ | |||
vbcolor = (GLchan (*)[4])VB->ColorPtr[1]->data; \ | |||
if (VB->SecondaryColorPtr[1]) { \ | |||
vbspec = (GLchan (*)[4])VB->SecondaryColorPtr[1]->data; \ | |||
vbcolor = (GLchan (*)[4])VB->BackfaceColorPtr->data; \ | |||
if (VB->BackfaceSecondaryColorPtr) { \ | |||
vbspec = (GLchan (*)[4])VB->BackfaceSecondaryColorPtr->data; \ | |||
} else { \ | |||
vbspec = NULL; \ | |||
} \ | |||
@@ -241,33 +241,33 @@ | |||
DWORD dwColor; | |||
#define GLD_SETUP_3D_VERTEX(v) \ | |||
p4f = VB->ObjPtr->data; \ | |||
p4f = VB->AttribPtr[_TNL_ATTRIB_POS]->data; \ | |||
pV->Position.x = p4f[##v][0]; \ | |||
pV->Position.y = p4f[##v][1]; \ | |||
pV->Position.z = p4f[##v][2]; | |||
#define GLD_SETUP_SMOOTH_COLOUR_3D(v) \ | |||
p4f = (GLfloat (*)[4])VB->ColorPtr[0]->data; \ | |||
p4f = (GLfloat (*)[4])VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; \ | |||
pV->Diffuse = D3DCOLOR_COLORVALUE(p4f[##v][0], p4f[##v][1], p4f[##v][2], p4f[##v][3]); | |||
#define GLD_SETUP_GET_FLAT_COLOUR_3D(v) \ | |||
p4f = (GLfloat (*)[4])VB->ColorPtr[0]->data; \ | |||
p4f = (GLfloat (*)[4])VB->AttribPtr[_TNL_ATTRIB_COLOR00]->data; \ | |||
dwColor = D3DCOLOR_COLORVALUE(p4f[##v][0], p4f[##v][1], p4f[##v][2], p4f[##v][3]); | |||
#define GLD_SETUP_USE_FLAT_COLOUR_3D \ | |||
pV->Diffuse = dwColor; | |||
#define GLD_SETUP_TEX0_3D(v) \ | |||
if (VB->TexCoordPtr[0]) { \ | |||
tc = VB->TexCoordPtr[0]->data; \ | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX0]) { \ | |||
tc = VB->AttribPtr[_TNL_ATTRIB_TEX0]->data; \ | |||
pV->TexUnit0.x = tc[##v][0]; \ | |||
pV->TexUnit0.y = tc[##v][1]; \ | |||
} | |||
#define GLD_SETUP_TEX1_3D(v) \ | |||
if (VB->TexCoordPtr[1]) { \ | |||
tc = VB->TexCoordPtr[1]->data; \ | |||
if (VB->AttribPtr[_TNL_ATTRIB_TEX1]) { \ | |||
tc = VB->AttribPtr[_TNL_ATTRIB_TEX1]->data; \ | |||
pV->TexUnit1.x = tc[##v][0]; \ | |||
pV->TexUnit1.y = tc[##v][1]; \ | |||
} |
@@ -149,7 +149,7 @@ static GLboolean gld_d3d_render_stage_run( | |||
#if 0 | |||
// For debugging: Useful to see if an app passes colour data in | |||
// an unusual format. | |||
switch (VB->ColorPtr[0]->Type) { | |||
switch (VB->AttribPtr[_TNL_ATTRIB_COLOR0]->Type) { | |||
case GL_FLOAT: | |||
ddlogMessage(GLDLOG_SYSTEM, "ColorPtr: GL_FLOAT\n"); | |||
break; |
@@ -523,7 +523,6 @@ static void emit_dst( struct prog_dst_register *dst, | |||
dst->CondMask = COND_TR; /* always pass cond test */ | |||
dst->CondSwizzle = SWIZZLE_NOOP; | |||
dst->CondSrc = 0; | |||
dst->pad = 0; | |||
/* Check that bitfield sizes aren't exceeded */ | |||
ASSERT(dst->Index == reg.idx); | |||
} |
@@ -312,7 +312,6 @@ struct prog_dst_register | |||
*/ | |||
GLuint CondSrc:1; | |||
/*@}*/ | |||
GLuint pad:28; | |||
}; | |||
@@ -67,8 +67,8 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
if (facing == 1) { | |||
if (IND & SS_TWOSIDE_BIT) { | |||
if (IND & SS_RGBA_BIT) { | |||
if (VB->ColorPtr[1]) { | |||
GLfloat (*vbcolor)[4] = VB->ColorPtr[1]->data; | |||
if (VB->BackfaceColorPtr) { | |||
GLfloat (*vbcolor)[4] = VB->BackfaceColorPtr->data; | |||
if (swsetup->intColors) { | |||
COPY_CHAN4(saved_color[0], v[0]->color); | |||
@@ -81,7 +81,7 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
COPY_4V(saved_col0[2], v[2]->attrib[FRAG_ATTRIB_COL0]); | |||
} | |||
if (VB->ColorPtr[1]->stride) { | |||
if (VB->BackfaceColorPtr->stride) { | |||
if (swsetup->intColors) { | |||
SS_COLOR(v[0]->color, vbcolor[e0]); | |||
SS_COLOR(v[1]->color, vbcolor[e1]); | |||
@@ -108,14 +108,14 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
} | |||
} | |||
if (VB->SecondaryColorPtr[1]) { | |||
GLfloat (*vbspec)[4] = VB->SecondaryColorPtr[1]->data; | |||
if (VB->BackfaceSecondaryColorPtr) { | |||
GLfloat (*vbspec)[4] = VB->BackfaceSecondaryColorPtr->data; | |||
COPY_4V(saved_spec[0], v[0]->attrib[FRAG_ATTRIB_COL1]); | |||
COPY_4V(saved_spec[1], v[1]->attrib[FRAG_ATTRIB_COL1]); | |||
COPY_4V(saved_spec[2], v[2]->attrib[FRAG_ATTRIB_COL1]); | |||
if (VB->SecondaryColorPtr[1]->stride) { | |||
if (VB->BackfaceSecondaryColorPtr->stride) { | |||
SS_SPEC(v[0]->attrib[FRAG_ATTRIB_COL1], vbspec[e0]); | |||
SS_SPEC(v[1]->attrib[FRAG_ATTRIB_COL1], vbspec[e1]); | |||
SS_SPEC(v[2]->attrib[FRAG_ATTRIB_COL1], vbspec[e2]); | |||
@@ -127,7 +127,7 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
} | |||
} | |||
} else { | |||
GLfloat *vbindex = (GLfloat *)VB->IndexPtr[1]->data; | |||
GLfloat *vbindex = (GLfloat *)VB->BackfaceIndexPtr->data; | |||
saved_index[0] = v[0]->attrib[FRAG_ATTRIB_CI][0]; | |||
saved_index[1] = v[1]->attrib[FRAG_ATTRIB_CI][0]; | |||
saved_index[2] = v[2]->attrib[FRAG_ATTRIB_CI][0]; | |||
@@ -200,7 +200,7 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
if (IND & SS_TWOSIDE_BIT) { | |||
if (facing == 1) { | |||
if (IND & SS_RGBA_BIT) { | |||
if (VB->ColorPtr[1]) { | |||
if (VB->BackfaceColorPtr) { | |||
if (swsetup->intColors) { | |||
COPY_CHAN4(v[0]->color, saved_color[0]); | |||
COPY_CHAN4(v[1]->color, saved_color[1]); | |||
@@ -213,7 +213,7 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
} | |||
} | |||
if (VB->SecondaryColorPtr[1]) { | |||
if (VB->BackfaceSecondaryColorPtr) { | |||
COPY_4V(v[0]->attrib[FRAG_ATTRIB_COL1], saved_spec[0]); | |||
COPY_4V(v[1]->attrib[FRAG_ATTRIB_COL1], saved_spec[1]); | |||
COPY_4V(v[2]->attrib[FRAG_ATTRIB_COL1], saved_spec[2]); |
@@ -198,26 +198,23 @@ struct vertex_buffer | |||
*/ | |||
GLuint Count; /**< Number of vertices currently in buffer */ | |||
/* Pointers to current data. | |||
* XXX some of these fields alias AttribPtr below and should be removed | |||
* such as NormalPtr, TexCoordPtr, FogCoordPtr, etc. | |||
/* Pointers to current data. Most of the data is in AttribPtr -- all of | |||
* it that is one of VERT_ATTRIB_X. For things only produced by TNL, | |||
* such as backface color or eye-space coordinates, they are stored | |||
* here. | |||
*/ | |||
GLuint *Elts; | |||
GLvector4f *ObjPtr; /* _TNL_BIT_POS */ | |||
GLvector4f *EyePtr; /* _TNL_BIT_POS */ | |||
GLvector4f *ClipPtr; /* _TNL_BIT_POS */ | |||
GLvector4f *NdcPtr; /* _TNL_BIT_POS */ | |||
GLubyte ClipOrMask; /* _TNL_BIT_POS */ | |||
GLubyte ClipAndMask; /* _TNL_BIT_POS */ | |||
GLubyte *ClipMask; /* _TNL_BIT_POS */ | |||
GLvector4f *NormalPtr; /* _TNL_BIT_NORMAL */ | |||
GLfloat *NormalLengthPtr; /* _TNL_BIT_NORMAL */ | |||
GLboolean *EdgeFlag; /* _TNL_BIT_EDGEFLAG */ | |||
GLvector4f *TexCoordPtr[MAX_TEXTURE_COORD_UNITS]; /* VERT_TEX_0..n */ | |||
GLvector4f *IndexPtr[2]; /* _TNL_BIT_INDEX */ | |||
GLvector4f *ColorPtr[2]; /* _TNL_BIT_COLOR0 */ | |||
GLvector4f *SecondaryColorPtr[2]; /* _TNL_BIT_COLOR1 */ | |||
GLvector4f *FogCoordPtr; /* _TNL_BIT_FOG */ | |||
GLvector4f *BackfaceIndexPtr; | |||
GLvector4f *BackfaceColorPtr; | |||
GLvector4f *BackfaceSecondaryColorPtr; | |||
const struct _mesa_prim *Primitive; | |||
GLuint PrimitiveCount; | |||
@@ -402,11 +399,6 @@ struct tnl_device_driver | |||
/* Alert tnl-aware drivers of changes to material. | |||
*/ | |||
void (*NotifyInputChanges)(GLcontext *ctx, GLuint bitmask); | |||
/* Alert tnl-aware drivers of changes to size and stride of input | |||
* arrays. | |||
*/ | |||
/*** | |||
*** Rendering -- These functions called only from t_vb_render.c | |||
***/ |
@@ -251,22 +251,10 @@ static void bind_inputs( GLcontext *ctx, | |||
*/ | |||
VB->Count = count; | |||
/* Legacy pointers -- remove one day. | |||
*/ | |||
VB->ObjPtr = VB->AttribPtr[_TNL_ATTRIB_POS]; | |||
VB->NormalPtr = VB->AttribPtr[_TNL_ATTRIB_NORMAL]; | |||
VB->ColorPtr[0] = VB->AttribPtr[_TNL_ATTRIB_COLOR0]; | |||
VB->ColorPtr[1] = NULL; | |||
VB->IndexPtr[0] = VB->AttribPtr[_TNL_ATTRIB_COLOR_INDEX]; | |||
VB->IndexPtr[1] = NULL; | |||
VB->SecondaryColorPtr[0] = VB->AttribPtr[_TNL_ATTRIB_COLOR1]; | |||
VB->SecondaryColorPtr[1] = NULL; | |||
VB->FogCoordPtr = VB->AttribPtr[_TNL_ATTRIB_FOG]; | |||
for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) { | |||
VB->TexCoordPtr[i] = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]; | |||
} | |||
/* These should perhaps be part of _TNL_ATTRIB_* */ | |||
VB->BackfaceColorPtr = NULL; | |||
VB->BackfaceIndexPtr = NULL; | |||
VB->BackfaceSecondaryColorPtr = NULL; | |||
/* Clipping and drawing code still requires this to be a packed | |||
* array of ubytes which can be written into. TODO: Fix and |
@@ -86,10 +86,6 @@ static GLuint check_input_changes( GLcontext *ctx ) | |||
} | |||
} | |||
if (tnl->pipeline.input_changes && | |||
tnl->Driver.NotifyInputChanges) | |||
tnl->Driver.NotifyInputChanges( ctx, tnl->pipeline.input_changes ); | |||
return tnl->pipeline.input_changes; | |||
} | |||
@@ -156,7 +156,7 @@ run_fog_stage(GLcontext *ctx, struct tnl_pipeline_stage *stage) | |||
GLuint i; | |||
GLfloat *coord; | |||
/* Fog is computed from vertex or fragment Z values */ | |||
/* source = VB->ObjPtr or VB->EyePtr coords */ | |||
/* source = VB->AttribPtr[_TNL_ATTRIB_POS] or VB->EyePtr coords */ | |||
/* dest = VB->AttribPtr[_TNL_ATTRIB_FOG] = fog stage private storage */ | |||
VB->AttribPtr[_TNL_ATTRIB_FOG] = &store->fogcoord; | |||
@@ -176,11 +176,12 @@ run_fog_stage(GLcontext *ctx, struct tnl_pipeline_stage *stage) | |||
/* Full eye coords weren't required, just calculate the | |||
* eye Z values. | |||
*/ | |||
_mesa_dotprod_tab[VB->ObjPtr->size]( (GLfloat *) input->data, | |||
4 * sizeof(GLfloat), | |||
VB->ObjPtr, plane ); | |||
_mesa_dotprod_tab[VB->AttribPtr[_TNL_ATTRIB_POS]->size] | |||
( (GLfloat *) input->data, | |||
4 * sizeof(GLfloat), | |||
VB->AttribPtr[_TNL_ATTRIB_POS], plane ); | |||
input->count = VB->ObjPtr->count; | |||
input->count = VB->AttribPtr[_TNL_ATTRIB_POS]->count; | |||
/* make sure coords are really positive | |||
NOTE should avoid going through array twice */ | |||
@@ -213,7 +214,7 @@ run_fog_stage(GLcontext *ctx, struct tnl_pipeline_stage *stage) | |||
/* input->count may be one if glFogCoord was only called once | |||
* before glBegin. But we need to compute fog for all vertices. | |||
*/ | |||
input->count = VB->ObjPtr->count; | |||
input->count = VB->AttribPtr[_TNL_ATTRIB_POS]->count; | |||
VB->AttribPtr[_TNL_ATTRIB_FOG] = &store->fogcoord; /* dest data */ | |||
} | |||
@@ -227,7 +228,6 @@ run_fog_stage(GLcontext *ctx, struct tnl_pipeline_stage *stage) | |||
VB->AttribPtr[_TNL_ATTRIB_FOG] = input; | |||
} | |||
VB->FogCoordPtr = VB->AttribPtr[_TNL_ATTRIB_FOG]; | |||
return GL_TRUE; | |||
} | |||
@@ -127,7 +127,7 @@ prepare_materials(GLcontext *ctx, | |||
const GLuint bitmask = ctx->Light.ColorMaterialBitmask; | |||
for (i = 0 ; i < MAT_ATTRIB_MAX ; i++) | |||
if (bitmask & (1<<i)) | |||
VB->AttribPtr[_TNL_ATTRIB_MAT_FRONT_AMBIENT + i] = VB->ColorPtr[0]; | |||
VB->AttribPtr[_TNL_ATTRIB_MAT_FRONT_AMBIENT + i] = VB->AttribPtr[_TNL_ATTRIB_COLOR0]; | |||
} | |||
/* Now, for each material attribute that's tracking vertex color, save | |||
@@ -200,7 +200,7 @@ static GLboolean run_lighting( GLcontext *ctx, | |||
struct light_stage_data *store = LIGHT_STAGE_DATA(stage); | |||
TNLcontext *tnl = TNL_CONTEXT(ctx); | |||
struct vertex_buffer *VB = &tnl->vb; | |||
GLvector4f *input = ctx->_NeedEyeCoords ? VB->EyePtr : VB->ObjPtr; | |||
GLvector4f *input = ctx->_NeedEyeCoords ? VB->EyePtr : VB->AttribPtr[_TNL_ATTRIB_POS]; | |||
GLuint idx; | |||
if (!ctx->Light.Enabled || ctx->VertexProgram._Current) | |||
@@ -208,13 +208,13 @@ static GLboolean run_lighting( GLcontext *ctx, | |||
/* Make sure we can talk about position x,y and z: | |||
*/ | |||
if (input->size <= 2 && input == VB->ObjPtr) { | |||
if (input->size <= 2 && input == VB->AttribPtr[_TNL_ATTRIB_POS]) { | |||
_math_trans_4f( store->Input.data, | |||
VB->ObjPtr->data, | |||
VB->ObjPtr->stride, | |||
VB->AttribPtr[_TNL_ATTRIB_POS]->data, | |||
VB->AttribPtr[_TNL_ATTRIB_POS]->stride, | |||
GL_FLOAT, | |||
VB->ObjPtr->size, | |||
VB->AttribPtr[_TNL_ATTRIB_POS]->size, | |||
0, | |||
VB->Count ); | |||
@@ -246,10 +246,6 @@ static GLboolean run_lighting( GLcontext *ctx, | |||
*/ | |||
store->light_func_tab[idx]( ctx, VB, stage, input ); | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR0] = VB->ColorPtr[0]; | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR1] = VB->SecondaryColorPtr[0]; | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR_INDEX] = VB->IndexPtr[0]; | |||
return GL_TRUE; | |||
} | |||
@@ -72,13 +72,13 @@ static void TAG(light_rgba_spec)( GLcontext *ctx, | |||
fprintf(stderr, "%s\n", __FUNCTION__ ); | |||
#endif | |||
VB->ColorPtr[0] = &store->LitColor[0]; | |||
VB->SecondaryColorPtr[0] = &store->LitSecondary[0]; | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR0] = &store->LitColor[0]; | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR1] = &store->LitSecondary[0]; | |||
sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; | |||
#if IDX & LIGHT_TWOSIDE | |||
VB->ColorPtr[1] = &store->LitColor[1]; | |||
VB->SecondaryColorPtr[1] = &store->LitSecondary[1]; | |||
VB->BackfaceColorPtr = &store->LitColor[1]; | |||
VB->BackfaceSecondaryColorPtr = &store->LitSecondary[1]; | |||
sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; | |||
#endif | |||
@@ -259,11 +259,11 @@ static void TAG(light_rgba)( GLcontext *ctx, | |||
fprintf(stderr, "%s\n", __FUNCTION__ ); | |||
#endif | |||
VB->ColorPtr[0] = &store->LitColor[0]; | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR0] = &store->LitColor[0]; | |||
sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; | |||
#if IDX & LIGHT_TWOSIDE | |||
VB->ColorPtr[1] = &store->LitColor[1]; | |||
VB->BackfaceColorPtr = &store->LitColor[1]; | |||
sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; | |||
#endif | |||
@@ -449,9 +449,9 @@ static void TAG(light_fast_rgba_single)( GLcontext *ctx, | |||
(void) input; /* doesn't refer to Eye or Obj */ | |||
VB->ColorPtr[0] = &store->LitColor[0]; | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR0] = &store->LitColor[0]; | |||
#if IDX & LIGHT_TWOSIDE | |||
VB->ColorPtr[1] = &store->LitColor[1]; | |||
VB->BackfaceColorPtr = &store->LitColor[1]; | |||
#endif | |||
if (nr > 1) { | |||
@@ -559,9 +559,9 @@ static void TAG(light_fast_rgba)( GLcontext *ctx, | |||
sumA[0] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; | |||
sumA[1] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; | |||
VB->ColorPtr[0] = &store->LitColor[0]; | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR0] = &store->LitColor[0]; | |||
#if IDX & LIGHT_TWOSIDE | |||
VB->ColorPtr[1] = &store->LitColor[1]; | |||
VB->BackfaceColorPtr = &store->LitColor[1]; | |||
#endif | |||
if (nr > 1) { | |||
@@ -665,14 +665,14 @@ static void TAG(light_ci)( GLcontext *ctx, | |||
fprintf(stderr, "%s\n", __FUNCTION__ ); | |||
#endif | |||
VB->IndexPtr[0] = &store->LitIndex[0]; | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR_INDEX] = &store->LitIndex[0]; | |||
#if IDX & LIGHT_TWOSIDE | |||
VB->IndexPtr[1] = &store->LitIndex[1]; | |||
VB->BackfaceIndexPtr = &store->LitIndex[1]; | |||
#endif | |||
indexResult[0] = (GLfloat *)VB->IndexPtr[0]->data; | |||
indexResult[0] = (GLfloat *)VB->AttribPtr[_TNL_ATTRIB_COLOR_INDEX]->data; | |||
#if IDX & LIGHT_TWOSIDE | |||
indexResult[1] = (GLfloat *)VB->IndexPtr[1]->data; | |||
indexResult[1] = (GLfloat *)VB->BackfaceIndexPtr->data; | |||
#endif | |||
/* loop over vertices */ |
@@ -79,7 +79,6 @@ run_normal_stage(GLcontext *ctx, struct tnl_pipeline_stage *stage) | |||
} | |||
VB->AttribPtr[_TNL_ATTRIB_NORMAL] = &store->normal; | |||
VB->NormalPtr = &store->normal; | |||
VB->NormalLengthPtr = NULL; /* no longer valid */ | |||
return GL_TRUE; |
@@ -454,19 +454,14 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage ) | |||
VB->ClipPtr->count = VB->Count; | |||
} | |||
VB->ColorPtr[0] = &store->results[VERT_RESULT_COL0]; | |||
VB->ColorPtr[1] = &store->results[VERT_RESULT_BFC0]; | |||
VB->SecondaryColorPtr[0] = &store->results[VERT_RESULT_COL1]; | |||
VB->SecondaryColorPtr[1] = &store->results[VERT_RESULT_BFC1]; | |||
VB->FogCoordPtr = &store->results[VERT_RESULT_FOGC]; | |||
VB->AttribPtr[VERT_ATTRIB_COLOR0] = &store->results[VERT_RESULT_COL0]; | |||
VB->AttribPtr[VERT_ATTRIB_COLOR1] = &store->results[VERT_RESULT_COL1]; | |||
VB->AttribPtr[VERT_ATTRIB_FOG] = &store->results[VERT_RESULT_FOGC]; | |||
VB->AttribPtr[_TNL_ATTRIB_POINTSIZE] = &store->results[VERT_RESULT_PSIZ]; | |||
VB->BackfaceColorPtr = &store->results[VERT_RESULT_BFC0]; | |||
VB->BackfaceSecondaryColorPtr = &store->results[VERT_RESULT_BFC1]; | |||
for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) { | |||
VB->TexCoordPtr[i] = | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + i] | |||
= &store->results[VERT_RESULT_TEX0 + i]; | |||
} |
@@ -341,7 +341,7 @@ static void texgen( GLcontext *ctx, | |||
GLvector4f *in = VB->AttribPtr[VERT_ATTRIB_TEX0 + unit]; | |||
GLvector4f *out = &store->texcoord[unit]; | |||
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; | |||
const GLvector4f *obj = VB->ObjPtr; | |||
const GLvector4f *obj = VB->AttribPtr[_TNL_ATTRIB_POS]; | |||
const GLvector4f *eye = VB->EyePtr; | |||
const GLvector4f *normal = VB->AttribPtr[_TNL_ATTRIB_NORMAL]; | |||
const GLfloat *m = store->tmp_m; | |||
@@ -498,7 +498,6 @@ static GLboolean run_texgen_stage( GLcontext *ctx, | |||
store->TexgenFunc[i]( ctx, store, i ); | |||
VB->TexCoordPtr[i] = | |||
VB->AttribPtr[VERT_ATTRIB_TEX0 + i] = &store->texcoord[i]; | |||
} | |||
} |
@@ -73,7 +73,6 @@ static GLboolean run_texmat_stage( GLcontext *ctx, | |||
ctx->TextureMatrixStack[i].Top, | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]); | |||
VB->TexCoordPtr[i] = | |||
VB->AttribPtr[VERT_ATTRIB_TEX0+i] = &store->texcoord[i]; | |||
} | |||
} |
@@ -152,16 +152,16 @@ static GLboolean run_vertex_stage( GLcontext *ctx, | |||
* Use combined ModelProject to avoid some depth artifacts | |||
*/ | |||
if (ctx->ModelviewMatrixStack.Top->type == MATRIX_IDENTITY) | |||
VB->EyePtr = VB->ObjPtr; | |||
VB->EyePtr = VB->AttribPtr[_TNL_ATTRIB_POS]; | |||
else | |||
VB->EyePtr = TransformRaw( &store->eye, | |||
ctx->ModelviewMatrixStack.Top, | |||
VB->ObjPtr); | |||
VB->AttribPtr[_TNL_ATTRIB_POS]); | |||
} | |||
VB->ClipPtr = TransformRaw( &store->clip, | |||
&ctx->_ModelProjectMatrix, | |||
VB->ObjPtr ); | |||
VB->AttribPtr[_TNL_ATTRIB_POS] ); | |||
/* Drivers expect this to be clean to element 4... | |||
*/ |
@@ -1092,33 +1092,33 @@ void _tnl_generic_interp_extras( GLcontext *ctx, | |||
{ | |||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; | |||
/* If stride is zero, ColorPtr[1] is constant across the VB, so | |||
/* If stride is zero, BackfaceColorPtr is constant across the VB, so | |||
* there is no point interpolating between two values as they will | |||
* be identical. In all other cases, this value is generated by | |||
* t_vb_lighttmp.h and has a stride of 4 dwords. | |||
*/ | |||
if (VB->ColorPtr[1] && VB->ColorPtr[1]->stride) { | |||
assert(VB->ColorPtr[1]->stride == 4 * sizeof(GLfloat)); | |||
if (VB->BackfaceColorPtr && VB->BackfaceColorPtr->stride) { | |||
assert(VB->BackfaceColorPtr->stride == 4 * sizeof(GLfloat)); | |||
INTERP_4F( t, | |||
VB->ColorPtr[1]->data[dst], | |||
VB->ColorPtr[1]->data[out], | |||
VB->ColorPtr[1]->data[in] ); | |||
VB->BackfaceColorPtr->data[dst], | |||
VB->BackfaceColorPtr->data[out], | |||
VB->BackfaceColorPtr->data[in] ); | |||
} | |||
if (VB->SecondaryColorPtr[1]) { | |||
assert(VB->SecondaryColorPtr[1]->stride == 4 * sizeof(GLfloat)); | |||
if (VB->BackfaceSecondaryColorPtr) { | |||
assert(VB->BackfaceSecondaryColorPtr->stride == 4 * sizeof(GLfloat)); | |||
INTERP_3F( t, | |||
VB->SecondaryColorPtr[1]->data[dst], | |||
VB->SecondaryColorPtr[1]->data[out], | |||
VB->SecondaryColorPtr[1]->data[in] ); | |||
VB->BackfaceSecondaryColorPtr->data[dst], | |||
VB->BackfaceSecondaryColorPtr->data[out], | |||
VB->BackfaceSecondaryColorPtr->data[in] ); | |||
} | |||
if (VB->IndexPtr[1]) { | |||
VB->IndexPtr[1]->data[dst][0] = LINTERP( t, | |||
VB->IndexPtr[1]->data[out][0], | |||
VB->IndexPtr[1]->data[in][0] ); | |||
if (VB->BackfaceIndexPtr) { | |||
VB->BackfaceIndexPtr->data[dst][0] = LINTERP( t, | |||
VB->BackfaceIndexPtr->data[out][0], | |||
VB->BackfaceIndexPtr->data[in][0] ); | |||
} | |||
if (VB->EdgeFlag) { | |||
@@ -1135,18 +1135,18 @@ void _tnl_generic_copy_pv_extras( GLcontext *ctx, | |||
/* See above comment: | |||
*/ | |||
if (VB->ColorPtr[1] && VB->ColorPtr[1]->stride) { | |||
COPY_4FV( VB->ColorPtr[1]->data[dst], | |||
VB->ColorPtr[1]->data[src] ); | |||
if (VB->BackfaceColorPtr && VB->BackfaceColorPtr->stride) { | |||
COPY_4FV( VB->BackfaceColorPtr->data[dst], | |||
VB->BackfaceColorPtr->data[src] ); | |||
} | |||
if (VB->SecondaryColorPtr[1]) { | |||
COPY_4FV( VB->SecondaryColorPtr[1]->data[dst], | |||
VB->SecondaryColorPtr[1]->data[src] ); | |||
if (VB->BackfaceSecondaryColorPtr) { | |||
COPY_4FV( VB->BackfaceSecondaryColorPtr->data[dst], | |||
VB->BackfaceSecondaryColorPtr->data[src] ); | |||
} | |||
if (VB->IndexPtr[1]) { | |||
VB->IndexPtr[1]->data[dst][0] = VB->IndexPtr[1]->data[src][0]; | |||
if (VB->BackfaceIndexPtr) { | |||
VB->BackfaceIndexPtr->data[dst][0] = VB->BackfaceIndexPtr->data[src][0]; | |||
} | |||
_tnl_generic_copy_pv(ctx, dst, src); |
@@ -443,7 +443,7 @@ static void TAG(render_quad_strip_verts)( GLcontext *ctx, | |||
} else if (HAVE_TRI_STRIPS && | |||
ctx->Light.ShadeModel == GL_FLAT && | |||
TNL_CONTEXT(ctx)->vb.ColorPtr[0]->stride) { | |||
TNL_CONTEXT(ctx)->vb.AttribPtr[_TNL_ATTRIB_COLOR0]->stride) { | |||
if (HAVE_ELTS) { | |||
LOCAL_VARS; | |||
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS(); | |||
@@ -1221,7 +1221,7 @@ static GLboolean TAG(validate_render)( GLcontext *ctx, | |||
ok = GL_TRUE; | |||
} else if (HAVE_TRI_STRIPS && | |||
ctx->Light.ShadeModel == GL_FLAT && | |||
VB->ColorPtr[0]->stride != 0) { | |||
VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride != 0) { | |||
if (HAVE_ELTS) { | |||
ok = (GLint) count < GET_SUBSEQUENT_VB_MAX_ELTS(); | |||
} |
@@ -195,7 +195,7 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
} | |||
} | |||
else { | |||
GLfloat (*vbcolor)[4] = VB->ColorPtr[1]->data; | |||
GLfloat (*vbcolor)[4] = VB->BackfaceColorPtr->data; | |||
(void) vbcolor; | |||
if (!DO_FLAT) { | |||
@@ -204,8 +204,8 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
} | |||
VERT_SAVE_RGBA( 2 ); | |||
if (VB->ColorPtr[1]->stride) { | |||
ASSERT(VB->ColorPtr[1]->stride == 4*sizeof(GLfloat)); | |||
if (VB->BackfaceColorPtr->stride) { | |||
ASSERT(VB->BackfaceColorPtr->stride == 4*sizeof(GLfloat)); | |||
if (!DO_FLAT) { | |||
VERT_SET_RGBA( v[0], vbcolor[e0] ); | |||
@@ -221,9 +221,9 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
VERT_SET_RGBA( v[2], vbcolor[0] ); | |||
} | |||
if (HAVE_SPEC && VB->SecondaryColorPtr[1]) { | |||
GLfloat (*vbspec)[4] = VB->SecondaryColorPtr[1]->data; | |||
ASSERT(VB->SecondaryColorPtr[1]->stride == 4*sizeof(GLfloat)); | |||
if (HAVE_SPEC && VB->BackfaceSecondaryColorPtr) { | |||
GLfloat (*vbspec)[4] = VB->BackfaceSecondaryColorPtr->data; | |||
ASSERT(VB->BackfaceSecondaryColorPtr->stride == 4*sizeof(GLfloat)); | |||
if (!DO_FLAT) { | |||
VERT_SAVE_SPEC( 0 ); | |||
@@ -237,7 +237,7 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
} | |||
} | |||
else { | |||
GLfloat (*vbindex) = (GLfloat *)VB->IndexPtr[1]->data; | |||
GLfloat (*vbindex) = (GLfloat *)VB->BackfaceIndexPtr->data; | |||
if (!DO_FLAT) { | |||
VERT_SAVE_IND( 0 ); | |||
VERT_SAVE_IND( 1 ); | |||
@@ -279,7 +279,7 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
VERT_SAVE_RGBA( 1 ); | |||
VERT_COPY_RGBA( v[0], v[2] ); | |||
VERT_COPY_RGBA( v[1], v[2] ); | |||
if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { | |||
if (HAVE_SPEC && VB->AttribPtr[_TNL_ATTRIB_COLOR1]) { | |||
VERT_SAVE_SPEC( 0 ); | |||
VERT_SAVE_SPEC( 1 ); | |||
VERT_COPY_SPEC( v[0], v[2] ); | |||
@@ -374,7 +374,7 @@ static void TAG(triangle)( GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 ) | |||
if (HAVE_RGBA) { | |||
VERT_RESTORE_RGBA( 0 ); | |||
VERT_RESTORE_RGBA( 1 ); | |||
if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { | |||
if (HAVE_SPEC && VB->AttribPtr[_TNL_ATTRIB_COLOR1]) { | |||
VERT_RESTORE_SPEC( 0 ); | |||
VERT_RESTORE_SPEC( 1 ); | |||
} | |||
@@ -436,7 +436,7 @@ static void TAG(quadr)( GLcontext *ctx, | |||
if (DO_TWOSIDE && facing == 1) | |||
{ | |||
if (HAVE_RGBA) { | |||
GLfloat (*vbcolor)[4] = VB->ColorPtr[1]->data; | |||
GLfloat (*vbcolor)[4] = VB->BackfaceColorPtr->data; | |||
(void)vbcolor; | |||
if (HAVE_BACK_COLORS) { | |||
@@ -471,7 +471,7 @@ static void TAG(quadr)( GLcontext *ctx, | |||
} | |||
VERT_SAVE_RGBA( 3 ); | |||
if (VB->ColorPtr[1]->stride) { | |||
if (VB->BackfaceColorPtr->stride) { | |||
if (!DO_FLAT) { | |||
VERT_SET_RGBA( v[0], vbcolor[e0] ); | |||
VERT_SET_RGBA( v[1], vbcolor[e1] ); | |||
@@ -488,9 +488,9 @@ static void TAG(quadr)( GLcontext *ctx, | |||
VERT_SET_RGBA( v[3], vbcolor[0] ); | |||
} | |||
if (HAVE_SPEC && VB->SecondaryColorPtr[1]) { | |||
GLfloat (*vbspec)[4] = VB->SecondaryColorPtr[1]->data; | |||
ASSERT(VB->SecondaryColorPtr[1]->stride==4*sizeof(GLfloat)); | |||
if (HAVE_SPEC && VB->BackfaceSecondaryColorPtr) { | |||
GLfloat (*vbspec)[4] = VB->BackfaceSecondaryColorPtr->data; | |||
ASSERT(VB->BackfaceSecondaryColorPtr->stride==4*sizeof(GLfloat)); | |||
if (!DO_FLAT) { | |||
VERT_SAVE_SPEC( 0 ); | |||
@@ -506,7 +506,7 @@ static void TAG(quadr)( GLcontext *ctx, | |||
} | |||
} | |||
else { | |||
GLfloat *vbindex = (GLfloat *)VB->IndexPtr[1]->data; | |||
GLfloat *vbindex = (GLfloat *)VB->BackfaceIndexPtr->data; | |||
if (!DO_FLAT) { | |||
VERT_SAVE_IND( 0 ); | |||
VERT_SAVE_IND( 1 ); | |||
@@ -553,7 +553,7 @@ static void TAG(quadr)( GLcontext *ctx, | |||
VERT_COPY_RGBA( v[0], v[3] ); | |||
VERT_COPY_RGBA( v[1], v[3] ); | |||
VERT_COPY_RGBA( v[2], v[3] ); | |||
if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { | |||
if (HAVE_SPEC && VB->AttribPtr[_TNL_ATTRIB_COLOR1]) { | |||
VERT_SAVE_SPEC( 0 ); | |||
VERT_SAVE_SPEC( 1 ); | |||
VERT_SAVE_SPEC( 2 ); | |||
@@ -659,7 +659,7 @@ static void TAG(quadr)( GLcontext *ctx, | |||
VERT_RESTORE_RGBA( 0 ); | |||
VERT_RESTORE_RGBA( 1 ); | |||
VERT_RESTORE_RGBA( 2 ); | |||
if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { | |||
if (HAVE_SPEC && VB->AttribPtr[_TNL_ATTRIB_COLOR1]) { | |||
VERT_RESTORE_SPEC( 0 ); | |||
VERT_RESTORE_SPEC( 1 ); | |||
VERT_RESTORE_SPEC( 2 ); | |||
@@ -708,7 +708,7 @@ static void TAG(line)( GLcontext *ctx, GLuint e0, GLuint e1 ) | |||
if (HAVE_RGBA) { | |||
VERT_SAVE_RGBA( 0 ); | |||
VERT_COPY_RGBA( v[0], v[1] ); | |||
if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { | |||
if (HAVE_SPEC && VB->AttribPtr[_TNL_ATTRIB_COLOR1]) { | |||
VERT_SAVE_SPEC( 0 ); | |||
VERT_COPY_SPEC( v[0], v[1] ); | |||
} | |||
@@ -725,7 +725,7 @@ static void TAG(line)( GLcontext *ctx, GLuint e0, GLuint e1 ) | |||
if (HAVE_RGBA) { | |||
VERT_RESTORE_RGBA( 0 ); | |||
if (HAVE_SPEC && VB->SecondaryColorPtr[0]) { | |||
if (HAVE_SPEC && VB->AttribPtr[_TNL_ATTRIB_COLOR1]) { | |||
VERT_RESTORE_SPEC( 0 ); | |||
} | |||
} |
@@ -297,19 +297,19 @@ INTERP_QUALIFIER void TAG(interp_extras)( GLcontext *ctx, | |||
LOCALVARS | |||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; | |||
if (VB->ColorPtr[1]) { | |||
assert(VB->ColorPtr[1]->stride == 4 * sizeof(GLfloat)); | |||
if (VB->BackfaceColorPtr) { | |||
assert(VB->BackfaceColorPtr->stride == 4 * sizeof(GLfloat)); | |||
INTERP_4F( t, | |||
GET_COLOR(VB->ColorPtr[1], dst), | |||
GET_COLOR(VB->ColorPtr[1], out), | |||
GET_COLOR(VB->ColorPtr[1], in) ); | |||
GET_COLOR(VB->BackfaceColorPtr, dst), | |||
GET_COLOR(VB->BackfaceColorPtr, out), | |||
GET_COLOR(VB->BackfaceColorPtr, in) ); | |||
if (VB->SecondaryColorPtr[1]) { | |||
if (VB->BackfaceSecondaryColorPtr) { | |||
INTERP_3F( t, | |||
GET_COLOR(VB->SecondaryColorPtr[1], dst), | |||
GET_COLOR(VB->SecondaryColorPtr[1], out), | |||
GET_COLOR(VB->SecondaryColorPtr[1], in) ); | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, dst), | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, out), | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, in) ); | |||
} | |||
} | |||
@@ -326,13 +326,13 @@ INTERP_QUALIFIER void TAG(copy_pv_extras)( GLcontext *ctx, | |||
LOCALVARS | |||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; | |||
if (VB->ColorPtr[1]) { | |||
COPY_4FV( GET_COLOR(VB->ColorPtr[1], dst), | |||
GET_COLOR(VB->ColorPtr[1], src) ); | |||
if (VB->BackfaceColorPtr) { | |||
COPY_4FV( GET_COLOR(VB->BackfaceColorPtr, dst), | |||
GET_COLOR(VB->BackfaceColorPtr, src) ); | |||
if (VB->SecondaryColorPtr[1]) { | |||
COPY_4FV( GET_COLOR(VB->SecondaryColorPtr[1], dst), | |||
GET_COLOR(VB->SecondaryColorPtr[1], src) ); | |||
if (VB->BackfaceSecondaryColorPtr) { | |||
COPY_4FV( GET_COLOR(VB->BackfaceSecondaryColorPtr, dst), | |||
GET_COLOR(VB->BackfaceSecondaryColorPtr, src) ); | |||
} | |||
} | |||
@@ -153,46 +153,46 @@ static void TAG(emit)( GLcontext *ctx, | |||
if (DO_TEX3) { | |||
const GLuint t3 = GET_TEXSOURCE(3); | |||
tc3 = VB->TexCoordPtr[t3]->data; | |||
tc3_stride = VB->TexCoordPtr[t3]->stride; | |||
tc3 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t3]->data; | |||
tc3_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t3]->stride; | |||
if (DO_PTEX) | |||
tc3_size = VB->TexCoordPtr[t3]->size; | |||
tc3_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t3]->size; | |||
} | |||
if (DO_TEX2) { | |||
const GLuint t2 = GET_TEXSOURCE(2); | |||
tc2 = VB->TexCoordPtr[t2]->data; | |||
tc2_stride = VB->TexCoordPtr[t2]->stride; | |||
tc2 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->data; | |||
tc2_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->stride; | |||
if (DO_PTEX) | |||
tc2_size = VB->TexCoordPtr[t2]->size; | |||
tc2_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t2]->size; | |||
} | |||
if (DO_TEX1) { | |||
const GLuint t1 = GET_TEXSOURCE(1); | |||
tc1 = VB->TexCoordPtr[t1]->data; | |||
tc1_stride = VB->TexCoordPtr[t1]->stride; | |||
tc1 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->data; | |||
tc1_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->stride; | |||
if (DO_PTEX) | |||
tc1_size = VB->TexCoordPtr[t1]->size; | |||
tc1_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t1]->size; | |||
} | |||
if (DO_TEX0) { | |||
const GLuint t0 = GET_TEXSOURCE(0); | |||
tc0_stride = VB->TexCoordPtr[t0]->stride; | |||
tc0 = VB->TexCoordPtr[t0]->data; | |||
tc0_stride = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->stride; | |||
tc0 = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->data; | |||
if (DO_PTEX) | |||
tc0_size = VB->TexCoordPtr[t0]->size; | |||
tc0_size = VB->AttribPtr[_TNL_ATTRIB_TEX0 + t0]->size; | |||
} | |||
if (DO_RGBA) { | |||
col_stride = VB->ColorPtr[0]->stride; | |||
col = VB->ColorPtr[0]->data; | |||
col_size = VB->ColorPtr[0]->size; | |||
col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; | |||
col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; | |||
col_size = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->size; | |||
} | |||
if (DO_SPEC) { | |||
if (VB->SecondaryColorPtr[0]) { | |||
spec_stride = VB->SecondaryColorPtr[0]->stride; | |||
spec = VB->SecondaryColorPtr[0]->data; | |||
if (VB->AttribPtr[_TNL_ATTRIB_COLOR1]) { | |||
spec_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->stride; | |||
spec = VB->AttribPtr[_TNL_ATTRIB_COLOR1]->data; | |||
} else { | |||
spec = (GLfloat (*)[4])ctx->Current.Attrib[VERT_ATTRIB_COLOR1]; | |||
spec_stride = 0; | |||
@@ -200,9 +200,9 @@ static void TAG(emit)( GLcontext *ctx, | |||
} | |||
if (DO_FOG) { | |||
if (VB->FogCoordPtr) { | |||
fog = VB->FogCoordPtr->data; | |||
fog_stride = VB->FogCoordPtr->stride; | |||
if (VB->AttribPtr[_TNL_ATTRIB_FOG]) { | |||
fog = VB->AttribPtr[_TNL_ATTRIB_FOG]->data; | |||
fog_stride = VB->AttribPtr[_TNL_ATTRIB_FOG]->stride; | |||
} | |||
else { | |||
static GLfloat tmp[4] = {0, 0, 0, 0}; | |||
@@ -356,9 +356,9 @@ static void TAG(emit)( GLcontext *ctx, GLuint start, GLuint end, | |||
ASSERT(stride == 4); | |||
col = VB->ColorPtr[0]->data; | |||
col_stride = VB->ColorPtr[0]->stride; | |||
col_size = VB->ColorPtr[0]->size; | |||
col = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->data; | |||
col_stride = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride; | |||
col_size = VB->AttribPtr[_TNL_ATTRIB_COLOR0]->size; | |||
/* fprintf(stderr, "%s(small) importable %x\n", */ | |||
/* __FUNCTION__, VB->importable_data); */ | |||
@@ -410,22 +410,22 @@ static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) | |||
/* Force 'missing' texcoords to something valid. | |||
*/ | |||
if (DO_TEX3 && VB->TexCoordPtr[2] == 0) | |||
VB->TexCoordPtr[2] = VB->TexCoordPtr[3]; | |||
if (DO_TEX3 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + 2] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + 2] = VB->AttribPtr[_TNL_ATTRIB_TEX0 + 3]; | |||
if (DO_TEX2 && VB->TexCoordPtr[1] == 0) | |||
VB->TexCoordPtr[1] = VB->TexCoordPtr[2]; | |||
if (DO_TEX2 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + 1] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + 1] = VB->AttribPtr[_TNL_ATTRIB_TEX0 + 2]; | |||
if (DO_TEX1 && VB->TexCoordPtr[0] == 0) | |||
VB->TexCoordPtr[0] = VB->TexCoordPtr[1]; | |||
if (DO_TEX1 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + 0] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + 0] = VB->AttribPtr[_TNL_ATTRIB_TEX0 + 1]; | |||
if (DO_PTEX) | |||
return GL_TRUE; | |||
if ((DO_TEX3 && VB->TexCoordPtr[GET_TEXSOURCE(3)]->size == 4) || | |||
(DO_TEX2 && VB->TexCoordPtr[GET_TEXSOURCE(2)]->size == 4) || | |||
(DO_TEX1 && VB->TexCoordPtr[GET_TEXSOURCE(1)]->size == 4) || | |||
(DO_TEX0 && VB->TexCoordPtr[GET_TEXSOURCE(0)]->size == 4)) | |||
if ((DO_TEX3 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(3)]->size == 4) || | |||
(DO_TEX2 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(2)]->size == 4) || | |||
(DO_TEX1 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(1)]->size == 4) || | |||
(DO_TEX0 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(0)]->size == 4)) | |||
return GL_FALSE; | |||
return GL_TRUE; | |||
@@ -438,14 +438,14 @@ static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) | |||
/* Force 'missing' texcoords to something valid. | |||
*/ | |||
if (DO_TEX3 && VB->TexCoordPtr[2] == 0) | |||
VB->TexCoordPtr[2] = VB->TexCoordPtr[3]; | |||
if (DO_TEX3 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + 2] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + 2] = VB->AttribPtr[_TNL_ATTRIB_TEX0 + 3]; | |||
if (DO_TEX2 && VB->TexCoordPtr[1] == 0) | |||
VB->TexCoordPtr[1] = VB->TexCoordPtr[2]; | |||
if (DO_TEX2 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + 1] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + 1] = VB->AttribPtr[_TNL_ATTRIB_TEX0 + 2]; | |||
if (DO_TEX1 && VB->TexCoordPtr[0] == 0) | |||
VB->TexCoordPtr[0] = VB->TexCoordPtr[1]; | |||
if (DO_TEX1 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + 0] == 0) | |||
VB->AttribPtr[_TNL_ATTRIB_TEX0 + 0] = VB->AttribPtr[_TNL_ATTRIB_TEX0 + 1]; | |||
if (DO_PTEX) | |||
return GL_TRUE; | |||
@@ -453,14 +453,14 @@ static GLboolean TAG(check_tex_sizes)( GLcontext *ctx ) | |||
/* No hardware support for projective texture. Can fake it for | |||
* TEX0 only. | |||
*/ | |||
if ((DO_TEX3 && VB->TexCoordPtr[GET_TEXSOURCE(3)]->size == 4) || | |||
(DO_TEX2 && VB->TexCoordPtr[GET_TEXSOURCE(2)]->size == 4) || | |||
(DO_TEX1 && VB->TexCoordPtr[GET_TEXSOURCE(1)]->size == 4)) { | |||
if ((DO_TEX3 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(3)]->size == 4) || | |||
(DO_TEX2 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(2)]->size == 4) || | |||
(DO_TEX1 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(1)]->size == 4)) { | |||
PTEX_FALLBACK(); | |||
return GL_FALSE; | |||
} | |||
if (DO_TEX0 && VB->TexCoordPtr[GET_TEXSOURCE(0)]->size == 4) { | |||
if (DO_TEX0 && VB->AttribPtr[_TNL_ATTRIB_TEX0 + GET_TEXSOURCE(0)]->size == 4) { | |||
if (DO_TEX1 || DO_TEX2 || DO_TEX3) { | |||
PTEX_FALLBACK(); | |||
} |
@@ -120,22 +120,22 @@ int main( int argc, char **argv ) | |||
OFFSET( "VB_COUNT ", struct vertex_buffer, Count ); | |||
printf( "\n" ); | |||
OFFSET( "VB_ELTS ", struct vertex_buffer, Elts ); | |||
OFFSET( "VB_OBJ_PTR ", struct vertex_buffer, ObjPtr ); | |||
OFFSET( "VB_OBJ_PTR ", struct vertex_buffer, AttribPtr[_TNL_ATTRIB_POS] ); | |||
OFFSET( "VB_EYE_PTR ", struct vertex_buffer, EyePtr ); | |||
OFFSET( "VB_CLIP_PTR ", struct vertex_buffer, ClipPtr ); | |||
OFFSET( "VB_PROJ_CLIP_PTR ", struct vertex_buffer, NdcPtr ); | |||
OFFSET( "VB_CLIP_OR_MASK ", struct vertex_buffer, ClipOrMask ); | |||
OFFSET( "VB_CLIP_MASK ", struct vertex_buffer, ClipMask ); | |||
OFFSET( "VB_NORMAL_PTR ", struct vertex_buffer, NormalPtr ); | |||
OFFSET( "VB_NORMAL_PTR ", struct vertex_buffer, AttribPtr[_TNL_ATTRIB_NORMAL] ); | |||
OFFSET( "VB_EDGE_FLAG ", struct vertex_buffer, EdgeFlag ); | |||
OFFSET( "VB_TEX0_COORD_PTR ", struct vertex_buffer, TexCoordPtr[0] ); | |||
OFFSET( "VB_TEX1_COORD_PTR ", struct vertex_buffer, TexCoordPtr[1] ); | |||
OFFSET( "VB_TEX2_COORD_PTR ", struct vertex_buffer, TexCoordPtr[2] ); | |||
OFFSET( "VB_TEX3_COORD_PTR ", struct vertex_buffer, TexCoordPtr[3] ); | |||
OFFSET( "VB_INDEX_PTR ", struct vertex_buffer, IndexPtr ); | |||
OFFSET( "VB_COLOR_PTR ", struct vertex_buffer, ColorPtr ); | |||
OFFSET( "VB_SECONDARY_COLOR_PTR ", struct vertex_buffer, SecondaryColorPtr ); | |||
OFFSET( "VB_FOG_COORD_PTR ", struct vertex_buffer, FogCoordPtr ); | |||
OFFSET( "VB_TEX0_COORD_PTR ", struct vertex_buffer, AttribPtr[_TNL_ATTRIB_TEX0] ); | |||
OFFSET( "VB_TEX1_COORD_PTR ", struct vertex_buffer, AttribPtr[_TNL_ATTRIB_TEX1] ); | |||
OFFSET( "VB_TEX2_COORD_PTR ", struct vertex_buffer, AttribPtr[_TNL_ATTRIB_TEX2] ); | |||
OFFSET( "VB_TEX3_COORD_PTR ", struct vertex_buffer, AttribPtr[_TNL_ATTRIB_TEX3] ); | |||
OFFSET( "VB_INDEX_PTR ", struct vertex_buffer, AttribPtr[_TNL_ATTRIB_COLOR_INDEX] ); | |||
OFFSET( "VB_COLOR_PTR ", struct vertex_buffer, AttribPtr[_TNL_ATTRIB_COLOR0] ); | |||
OFFSET( "VB_SECONDARY_COLOR_PTR ", struct vertex_buffer, AttribPtr[_TNL_ATTRIB_COLOR1] ); | |||
OFFSET( "VB_FOG_COORD_PTR ", struct vertex_buffer, AttribPtr[_TNL_ATTRIB_FOG] ); | |||
OFFSET( "VB_PRIMITIVE ", struct vertex_buffer, Primitive ); | |||
printf( "\n" ); | |||