/**************************************************************************
*
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2007 VMware, Inc.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* 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.
#include "util/u_format.h"
#include "util/u_math.h"
#include "util/u_memory.h"
-#include "util/u_rect.h"
+#include "util/u_surface.h"
#include "util/u_tile.h"
* Move raw block of pixels from transfer object to user memory.
*/
void
-pipe_get_tile_raw(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_get_tile_raw(struct pipe_transfer *pt,
+ const void *src,
uint x, uint y, uint w, uint h,
void *dst, int dst_stride)
{
- const void *src;
-
if (dst_stride == 0)
dst_stride = util_format_get_stride(pt->resource->format, w);
if (u_clip_tile(x, y, &w, &h, &pt->box))
return;
- src = pipe->transfer_map(pipe, pt);
- assert(src);
- if(!src)
- return;
-
util_copy_rect(dst, pt->resource->format, dst_stride, 0, 0, w, h, src, pt->stride, x, y);
-
- pipe->transfer_unmap(pipe, pt);
}
* Move raw block of pixels from user memory to transfer object.
*/
void
-pipe_put_tile_raw(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_put_tile_raw(struct pipe_transfer *pt,
+ void *dst,
uint x, uint y, uint w, uint h,
const void *src, int src_stride)
{
- void *dst;
enum pipe_format format = pt->resource->format;
if (src_stride == 0)
if (u_clip_tile(x, y, &w, &h, &pt->box))
return;
- dst = pipe->transfer_map(pipe, pt);
- assert(dst);
- if(!dst)
- return;
-
util_copy_rect(dst, format, pt->stride, x, y, w, h, src, src_stride, 0, 0);
-
- pipe->transfer_unmap(pipe, pt);
}
unsigned i, j;
for (i = 0; i < h; i++) {
- float *pRow = p;
+ uint32_t *pRow = (uint32_t *)p;
for (j = 0; j < w; j++, pRow += 4) {
pRow[0] =
pRow[1] =
pRow[2] =
- pRow[3] = (float)((*src++ >> 24) & 0xff);
+ pRow[3] = ((*src++ >> 24) & 0xff);
}
p += dst_stride;
unsigned i, j;
for (i = 0; i < h; i++) {
- float *pRow = p;
+ uint32_t *pRow = (uint32_t *)p;
for (j = 0; j < w; j++, pRow += 4) {
pRow[0] =
pRow[1] =
pRow[2] =
- pRow[3] = (float)(*src++ & 0xff);
+ pRow[3] = (*src++ & 0xff);
}
p += dst_stride;
}
unsigned i, j;
for (i = 0; i < h; i++) {
- float *pRow = p;
+ uint32_t *pRow = (uint32_t *)p;
for (j = 0; j < w; j++, pRow += 4) {
pRow[0] =
pRow[1] =
pRow[2] =
- pRow[3] = (float)(*src++ & 0xff);
+ pRow[3] = (*src++ & 0xff);
}
p += dst_stride;
}
unsigned i, j;
for (i = 0; i < h; i++) {
- float *pRow = p;
+ uint32_t *pRow = (uint32_t *)p;
for (j = 0; j < w; j++, pRow += 4) {
src++;
pRow[0] =
pRow[1] =
pRow[2] =
- pRow[3] = (float)(*src++ & 0xff);
+ pRow[3] = (*src++ & 0xff);
}
p += dst_stride;
}
void
pipe_tile_raw_to_rgba(enum pipe_format format,
- void *src,
+ const void *src,
uint w, uint h,
float *dst, unsigned dst_stride)
{
z32f_x24s8_get_tile_rgba((float *) src, w, h, dst, dst_stride);
break;
case PIPE_FORMAT_X32_S8X24_UINT:
- x32_s8_get_tile_rgba((float *) src, w, h, dst, dst_stride);
+ x32_s8_get_tile_rgba((unsigned *) src, w, h, dst, dst_stride);
break;
default:
util_format_read_4f(format,
void
pipe_tile_raw_to_unsigned(enum pipe_format format,
- void *src,
+ const void *src,
uint w, uint h,
unsigned *dst, unsigned dst_stride)
{
}
void
-pipe_get_tile_rgba(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_get_tile_rgba(struct pipe_transfer *pt,
+ const void *src,
uint x, uint y, uint w, uint h,
float *p)
{
- pipe_get_tile_rgba_format(pipe, pt, x, y, w, h, pt->resource->format, p);
+ pipe_get_tile_rgba_format(pt, src, x, y, w, h, pt->resource->format, p);
}
void
-pipe_get_tile_rgba_format(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_get_tile_rgba_format(struct pipe_transfer *pt,
+ const void *src,
uint x, uint y, uint w, uint h,
enum pipe_format format,
float *p)
assert((x & 1) == 0);
}
- pipe_get_tile_raw(pipe, pt, x, y, w, h, packed, 0);
+ pipe_get_tile_raw(pt, src, x, y, w, h, packed, 0);
pipe_tile_raw_to_rgba(format, packed, w, h, p, dst_stride);
void
-pipe_put_tile_rgba(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_put_tile_rgba(struct pipe_transfer *pt,
+ void *dst,
uint x, uint y, uint w, uint h,
const float *p)
{
- pipe_put_tile_rgba_format(pipe, pt, x, y, w, h, pt->resource->format, p);
+ pipe_put_tile_rgba_format(pt, dst, x, y, w, h, pt->resource->format, p);
}
void
-pipe_put_tile_rgba_format(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_put_tile_rgba_format(struct pipe_transfer *pt,
+ void *dst,
uint x, uint y, uint w, uint h,
enum pipe_format format,
const float *p)
0, 0, w, h);
}
- pipe_put_tile_raw(pipe, pt, x, y, w, h, packed, 0);
+ pipe_put_tile_raw(pt, dst, x, y, w, h, packed, 0);
FREE(packed);
}
void
-pipe_put_tile_i_format(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_put_tile_i_format(struct pipe_transfer *pt,
+ void *dst,
uint x, uint y, uint w, uint h,
enum pipe_format format,
const int *p)
packed, util_format_get_stride(format, w),
0, 0, w, h);
- pipe_put_tile_raw(pipe, pt, x, y, w, h, packed, 0);
+ pipe_put_tile_raw(pt, dst, x, y, w, h, packed, 0);
FREE(packed);
}
void
-pipe_put_tile_ui_format(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_put_tile_ui_format(struct pipe_transfer *pt,
+ void *dst,
uint x, uint y, uint w, uint h,
enum pipe_format format,
const unsigned int *p)
packed, util_format_get_stride(format, w),
0, 0, w, h);
- pipe_put_tile_raw(pipe, pt, x, y, w, h, packed, 0);
+ pipe_put_tile_raw(pt, dst, x, y, w, h, packed, 0);
FREE(packed);
}
* Get a block of Z values, converted to 32-bit range.
*/
void
-pipe_get_tile_z(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_get_tile_z(struct pipe_transfer *pt,
+ const void *src,
uint x, uint y, uint w, uint h,
uint *z)
{
const uint dstStride = w;
- ubyte *map;
+ const ubyte *map = src;
uint *pDest = z;
uint i, j;
enum pipe_format format = pt->resource->format;
if (u_clip_tile(x, y, &w, &h, &pt->box))
return;
- map = (ubyte *)pipe->transfer_map(pipe, pt);
- if (!map) {
- assert(0);
- return;
- }
-
switch (format) {
case PIPE_FORMAT_Z32_UNORM:
{
}
}
break;
+ case PIPE_FORMAT_Z32_FLOAT:
+ {
+ const float *ptrc = (const float *)(map + y * pt->stride + x*4);
+ for (i = 0; i < h; i++) {
+ for (j = 0; j < w; j++) {
+ /* convert float Z to 32-bit Z */
+ if (ptrc[j] <= 0.0) {
+ pDest[j] = 0;
+ }
+ else if (ptrc[j] >= 1.0) {
+ pDest[j] = 0xffffffff;
+ }
+ else {
+ double z = ptrc[j] * 0xffffffff;
+ pDest[j] = (uint) z;
+ }
+ }
+ pDest += dstStride;
+ ptrc += pt->stride/4;
+ }
+ }
+ break;
+ case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
+ {
+ const float *ptrc = (const float *)(map + y * pt->stride + x*8);
+ for (i = 0; i < h; i++) {
+ for (j = 0; j < w; j++) {
+ /* convert float Z to 32-bit Z */
+ if (ptrc[j] <= 0.0) {
+ pDest[j*2] = 0;
+ }
+ else if (ptrc[j] >= 1.0) {
+ pDest[j*2] = 0xffffffff;
+ }
+ else {
+ double z = ptrc[j] * 0xffffffff;
+ pDest[j*2] = (uint) z;
+ }
+ }
+ pDest += dstStride;
+ ptrc += pt->stride/4;
+ }
+ }
+ break;
default:
assert(0);
}
-
- pipe->transfer_unmap(pipe, pt);
}
void
-pipe_put_tile_z(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_put_tile_z(struct pipe_transfer *pt,
+ void *dst,
uint x, uint y, uint w, uint h,
const uint *zSrc)
{
const uint srcStride = w;
const uint *ptrc = zSrc;
- ubyte *map;
+ ubyte *map = dst;
uint i, j;
enum pipe_format format = pt->resource->format;
if (u_clip_tile(x, y, &w, &h, &pt->box))
return;
- map = (ubyte *)pipe->transfer_map(pipe, pt);
- if (!map) {
- assert(0);
- return;
- }
-
switch (format) {
case PIPE_FORMAT_Z32_UNORM:
{
}
}
break;
+ case PIPE_FORMAT_Z32_FLOAT:
+ {
+ float *pDest = (float *) (map + y * pt->stride + x*4);
+ for (i = 0; i < h; i++) {
+ for (j = 0; j < w; j++) {
+ /* convert 32-bit integer Z to float Z */
+ const double scale = 1.0 / 0xffffffffU;
+ pDest[j] = (float) (ptrc[j] * scale);
+ }
+ pDest += pt->stride/4;
+ ptrc += srcStride;
+ }
+ }
+ break;
+ case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
+ {
+ float *pDest = (float *) (map + y * pt->stride + x*8);
+ for (i = 0; i < h; i++) {
+ for (j = 0; j < w; j++) {
+ /* convert 32-bit integer Z to float Z */
+ const double scale = 1.0 / 0xffffffffU;
+ pDest[j*2] = (float) (ptrc[j] * scale);
+ }
+ pDest += pt->stride/4;
+ ptrc += srcStride;
+ }
+ }
+ break;
default:
assert(0);
}
-
- pipe->transfer_unmap(pipe, pt);
}
void
-pipe_get_tile_ui_format(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_get_tile_ui_format(struct pipe_transfer *pt,
+ const void *src,
uint x, uint y, uint w, uint h,
enum pipe_format format,
unsigned int *p)
assert((x & 1) == 0);
}
- pipe_get_tile_raw(pipe, pt, x, y, w, h, packed, 0);
+ pipe_get_tile_raw(pt, src, x, y, w, h, packed, 0);
pipe_tile_raw_to_unsigned(format, packed, w, h, p, dst_stride);
void
-pipe_get_tile_i_format(struct pipe_context *pipe,
- struct pipe_transfer *pt,
+pipe_get_tile_i_format(struct pipe_transfer *pt,
+ const void *src,
uint x, uint y, uint w, uint h,
enum pipe_format format,
int *p)
assert((x & 1) == 0);
}
- pipe_get_tile_raw(pipe, pt, x, y, w, h, packed, 0);
+ pipe_get_tile_raw(pt, src, x, y, w, h, packed, 0);
pipe_tile_raw_to_signed(format, packed, w, h, p, dst_stride);