mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-06 17:30:20 +01:00
Merge branch 'master' of ssh://richardradeon@git.freedesktop.org/git/mesa/mesa
This commit is contained in:
commit
49b3f4a6bc
76 changed files with 958 additions and 1078 deletions
|
|
@ -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
|
||||
{
|
||||
struct pb_buffer base;
|
||||
|
||||
struct pb_buffer *buffer;
|
||||
/*
|
||||
* Immutable members.
|
||||
*/
|
||||
|
||||
/* FIXME: protect access with mutex */
|
||||
struct pb_buffer base;
|
||||
struct pb_buffer *buffer;
|
||||
struct fenced_buffer_list *list;
|
||||
|
||||
/**
|
||||
* Protected by fenced_buffer_list::mutex
|
||||
*/
|
||||
struct list_head head;
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
pb_fence(fenced_buf->buffer, fence);
|
||||
pipe_mutex_lock(fenced_buf->mutex);
|
||||
|
||||
fenced_buf->vl = NULL;
|
||||
fenced_buf->validation_flags = 0;
|
||||
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);
|
||||
|
||||
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(&d[CHAN_W], 1, CHAN_W);
|
||||
}
|
||||
|
||||
if (IS_CHANNEL_ENABLED( *inst, CHAN_W )) {
|
||||
FETCH( &r[0], 1, CHAN_W );
|
||||
STORE( &r[0], 0, 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);
|
||||
region_desc->bo_handle);
|
||||
|
||||
/* 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->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" );
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue