diff options
| -rw-r--r-- | src/mesa/shader/prog_execute.c | 66 | 
1 files changed, 42 insertions, 24 deletions
| diff --git a/src/mesa/shader/prog_execute.c b/src/mesa/shader/prog_execute.c index 1ef801a17d..fb29768935 100644 --- a/src/mesa/shader/prog_execute.c +++ b/src/mesa/shader/prog_execute.c @@ -341,6 +341,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.   */ @@ -1633,12 +1655,11 @@ _mesa_execute_program(GLcontext * ctx,           break;        case OPCODE_UP2H:        /* unpack two 16-bit floats */           { -            GLfloat a[4], result[4]; -            const GLuint *rawBits = (const GLuint *) a; +            const GLuint raw = fetch_vector1ui(&inst->SrcReg[0], machine); +            GLfloat result[4];              GLhalfNV hx, hy; -            fetch_vector1(&inst->SrcReg[0], machine, a); -            hx = rawBits[0] & 0xffff; -            hy = rawBits[0] >> 16; +            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); @@ -1646,12 +1667,11 @@ _mesa_execute_program(GLcontext * ctx,           break;        case OPCODE_UP2US:       /* unpack two GLushorts */           { -            GLfloat a[4], result[4]; -            const GLuint *rawBits = (const GLuint *) a; +            const GLuint raw = fetch_vector1ui(&inst->SrcReg[0], machine); +            GLfloat result[4];              GLushort usx, usy; -            fetch_vector1(&inst->SrcReg[0], machine, a); -            usx = rawBits[0] & 0xffff; -            usy = rawBits[0] >> 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); @@ -1659,25 +1679,23 @@ _mesa_execute_program(GLcontext * ctx,           break;        case OPCODE_UP4B:        /* unpack four GLbytes */           { -            GLfloat a[4], result[4]; -            const GLuint *rawBits = (const GLuint *) a; -            fetch_vector1(&inst->SrcReg[0], machine, a); -            result[0] = (((rawBits[0] >> 0) & 0xff) - 128) / 127.0F; -            result[1] = (((rawBits[0] >> 8) & 0xff) - 128) / 127.0F; -            result[2] = (((rawBits[0] >> 16) & 0xff) - 128) / 127.0F; -            result[3] = (((rawBits[0] >> 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]; -            const GLuint *rawBits = (const GLuint *) a; -            fetch_vector1(&inst->SrcReg[0], machine, a); -            result[0] = ((rawBits[0] >> 0) & 0xff) / 255.0F; -            result[1] = ((rawBits[0] >> 8) & 0xff) / 255.0F; -            result[2] = ((rawBits[0] >> 16) & 0xff) / 255.0F; -            result[3] = ((rawBits[0] >> 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; | 
