mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
Merge branch 'mesa_7_7_branch'
Conflicts: src/mesa/shader/prog_execute.c
This commit is contained in:
commit
7b5ad23c7f
3 changed files with 84 additions and 44 deletions
|
|
@ -63,7 +63,7 @@ struct xm_buffer
|
|||
|
||||
XImage *tempImage;
|
||||
#ifdef USE_XSHM
|
||||
int shm;
|
||||
boolean shm; /** Is this a shared memory buffer? */
|
||||
XShmSegmentInfo shminfo;
|
||||
#endif
|
||||
};
|
||||
|
|
@ -152,7 +152,7 @@ alloc_shm_ximage(struct xm_buffer *b, struct xmesa_buffer *xmb,
|
|||
&b->shminfo,
|
||||
width, height);
|
||||
if (b->tempImage == NULL) {
|
||||
b->shm = 0;
|
||||
b->shm = FALSE;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -169,12 +169,12 @@ alloc_shm_ximage(struct xm_buffer *b, struct xmesa_buffer *xmb,
|
|||
mesaXErrorFlag = 0;
|
||||
XDestroyImage(b->tempImage);
|
||||
b->tempImage = NULL;
|
||||
b->shm = 0;
|
||||
b->shm = FALSE;
|
||||
(void) XSetErrorHandler(old_handler);
|
||||
return;
|
||||
}
|
||||
|
||||
b->shm = 1;
|
||||
b->shm = TRUE;
|
||||
}
|
||||
|
||||
#endif /* USE_XSHM */
|
||||
|
|
@ -222,12 +222,13 @@ xm_buffer_destroy(struct pipe_buffer *buf)
|
|||
oldBuf->shminfo.shmaddr = (char *) -1;
|
||||
}
|
||||
|
||||
if (oldBuf->shm) {
|
||||
oldBuf->data = NULL;
|
||||
}
|
||||
|
||||
if (oldBuf->tempImage) {
|
||||
if (oldBuf->data == oldBuf->tempImage->data) {
|
||||
/* oldBuf->data points at the xshm memory which we'll now free */
|
||||
oldBuf->data = NULL;
|
||||
}
|
||||
XDestroyImage(oldBuf->tempImage);
|
||||
oldBuf->tempImage = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -342,10 +343,8 @@ xm_buffer_create(struct pipe_winsys *pws,
|
|||
buffer->base.usage = usage;
|
||||
buffer->base.size = size;
|
||||
|
||||
if (buffer->data == NULL) {
|
||||
/* align to 16-byte multiple for Cell */
|
||||
buffer->data = align_malloc(size, max(alignment, 16));
|
||||
}
|
||||
/* align to 16-byte multiple for Cell */
|
||||
buffer->data = align_malloc(size, max(alignment, 16));
|
||||
|
||||
return &buffer->base;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -561,6 +561,8 @@ _mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index,
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Set a program env parameter register.
|
||||
* \note Called from the GL API dispatcher.
|
||||
|
|
@ -569,10 +571,35 @@ _mesa_ProgramEnvParameter4fARB(GLenum target, GLuint index,
|
|||
*/
|
||||
void GLAPIENTRY
|
||||
_mesa_ProgramEnvParameter4fvARB(GLenum target, GLuint index,
|
||||
const GLfloat *params)
|
||||
const GLfloat *params)
|
||||
{
|
||||
_mesa_ProgramEnvParameter4fARB(target, index, params[0], params[1],
|
||||
params[2], params[3]);
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
ASSERT_OUTSIDE_BEGIN_END(ctx);
|
||||
|
||||
FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
|
||||
|
||||
if (target == GL_FRAGMENT_PROGRAM_ARB
|
||||
&& ctx->Extensions.ARB_fragment_program) {
|
||||
if (index >= ctx->Const.FragmentProgram.MaxEnvParams) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramEnvParameter4fv(index)");
|
||||
return;
|
||||
}
|
||||
memcpy(ctx->FragmentProgram.Parameters[index], params,
|
||||
4 * sizeof(GLfloat));
|
||||
}
|
||||
else if (target == GL_VERTEX_PROGRAM_ARB /* == GL_VERTEX_PROGRAM_NV */
|
||||
&& (ctx->Extensions.ARB_vertex_program || ctx->Extensions.NV_vertex_program)) {
|
||||
if (index >= ctx->Const.VertexProgram.MaxEnvParams) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glProgramEnvParameter4fv(index)");
|
||||
return;
|
||||
}
|
||||
memcpy(ctx->VertexProgram.Parameters[index], params,
|
||||
4 * sizeof(GLfloat));
|
||||
}
|
||||
else {
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "glProgramEnvParameter4fv(target)");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -351,6 +351,28 @@ fetch_vector1(const struct prog_src_register *source,
|
|||
}
|
||||
|
||||
|
||||
static GLuint
|
||||
fetch_vector1ui(const struct prog_src_register *source,
|
||||
const struct gl_program_machine *machine)
|
||||
{
|
||||
const GLuint *src = (GLuint *) get_src_register_pointer(source, machine);
|
||||
GLuint result;
|
||||
|
||||
ASSERT(src);
|
||||
|
||||
result = src[GET_SWZ(source->Swizzle, 0)];
|
||||
|
||||
if (source->Abs) {
|
||||
result = FABSF(result);
|
||||
}
|
||||
if (source->Negate) {
|
||||
result = -result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fetch texel from texture. Use partial derivatives when possible.
|
||||
*/
|
||||
|
|
@ -1667,13 +1689,11 @@ _mesa_execute_program(GLcontext * ctx,
|
|||
break;
|
||||
case OPCODE_UP2H: /* unpack two 16-bit floats */
|
||||
{
|
||||
GLfloat a[4], result[4];
|
||||
fi_type fi;
|
||||
GLhalfNV hx, hy;
|
||||
fetch_vector1(&inst->SrcReg[0], machine, a);
|
||||
fi.f = a[0];
|
||||
hx = fi.i & 0xffff;
|
||||
hy = fi.i >> 16;
|
||||
const GLuint raw = fetch_vector1ui(&inst->SrcReg[0], machine);
|
||||
GLfloat result[4];
|
||||
GLushort hx, hy;
|
||||
hx = raw & 0xffff;
|
||||
hy = raw >> 16;
|
||||
result[0] = result[2] = _mesa_half_to_float(hx);
|
||||
result[1] = result[3] = _mesa_half_to_float(hy);
|
||||
store_vector4(inst, machine, result);
|
||||
|
|
@ -1681,13 +1701,11 @@ _mesa_execute_program(GLcontext * ctx,
|
|||
break;
|
||||
case OPCODE_UP2US: /* unpack two GLushorts */
|
||||
{
|
||||
GLfloat a[4], result[4];
|
||||
fi_type fi;
|
||||
const GLuint raw = fetch_vector1ui(&inst->SrcReg[0], machine);
|
||||
GLfloat result[4];
|
||||
GLushort usx, usy;
|
||||
fetch_vector1(&inst->SrcReg[0], machine, a);
|
||||
fi.f = a[0];
|
||||
usx = fi.i & 0xffff;
|
||||
usy = fi.i >> 16;
|
||||
usx = raw & 0xffff;
|
||||
usy = raw >> 16;
|
||||
result[0] = result[2] = usx * (1.0f / 65535.0f);
|
||||
result[1] = result[3] = usy * (1.0f / 65535.0f);
|
||||
store_vector4(inst, machine, result);
|
||||
|
|
@ -1695,27 +1713,23 @@ _mesa_execute_program(GLcontext * ctx,
|
|||
break;
|
||||
case OPCODE_UP4B: /* unpack four GLbytes */
|
||||
{
|
||||
GLfloat a[4], result[4];
|
||||
fi_type fi;
|
||||
fetch_vector1(&inst->SrcReg[0], machine, a);
|
||||
fi.f = a[0];
|
||||
result[0] = (((fi.i >> 0) & 0xff) - 128) / 127.0F;
|
||||
result[1] = (((fi.i >> 8) & 0xff) - 128) / 127.0F;
|
||||
result[2] = (((fi.i >> 16) & 0xff) - 128) / 127.0F;
|
||||
result[3] = (((fi.i >> 24) & 0xff) - 128) / 127.0F;
|
||||
const GLuint raw = fetch_vector1ui(&inst->SrcReg[0], machine);
|
||||
GLfloat result[4];
|
||||
result[0] = (((raw >> 0) & 0xff) - 128) / 127.0F;
|
||||
result[1] = (((raw >> 8) & 0xff) - 128) / 127.0F;
|
||||
result[2] = (((raw >> 16) & 0xff) - 128) / 127.0F;
|
||||
result[3] = (((raw >> 24) & 0xff) - 128) / 127.0F;
|
||||
store_vector4(inst, machine, result);
|
||||
}
|
||||
break;
|
||||
case OPCODE_UP4UB: /* unpack four GLubytes */
|
||||
{
|
||||
GLfloat a[4], result[4];
|
||||
fi_type fi;
|
||||
fetch_vector1(&inst->SrcReg[0], machine, a);
|
||||
fi.f = a[0];
|
||||
result[0] = ((fi.i >> 0) & 0xff) / 255.0F;
|
||||
result[1] = ((fi.i >> 8) & 0xff) / 255.0F;
|
||||
result[2] = ((fi.i >> 16) & 0xff) / 255.0F;
|
||||
result[3] = ((fi.i >> 24) & 0xff) / 255.0F;
|
||||
const GLuint raw = fetch_vector1ui(&inst->SrcReg[0], machine);
|
||||
GLfloat result[4];
|
||||
result[0] = ((raw >> 0) & 0xff) / 255.0F;
|
||||
result[1] = ((raw >> 8) & 0xff) / 255.0F;
|
||||
result[2] = ((raw >> 16) & 0xff) / 255.0F;
|
||||
result[3] = ((raw >> 24) & 0xff) / 255.0F;
|
||||
store_vector4(inst, machine, result);
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue