gallium: move surface utility functions into u_surface.c
This is a better place than in u_rect.c
This commit is contained in:
@@ -47,6 +47,7 @@
|
|||||||
#include "util/u_rect.h"
|
#include "util/u_rect.h"
|
||||||
#include "util/u_sampler.h"
|
#include "util/u_sampler.h"
|
||||||
#include "util/u_simple_shaders.h"
|
#include "util/u_simple_shaders.h"
|
||||||
|
#include "util/u_surface.h"
|
||||||
#include "util/u_texture.h"
|
#include "util/u_texture.h"
|
||||||
|
|
||||||
#define INVALID_PTR ((void*)~0)
|
#define INVALID_PTR ((void*)~0)
|
||||||
|
@@ -33,6 +33,7 @@
|
|||||||
#include "pipe/p_state.h"
|
#include "pipe/p_state.h"
|
||||||
#include "util/u_pack_color.h"
|
#include "util/u_pack_color.h"
|
||||||
#include "util/u_rect.h"
|
#include "util/u_rect.h"
|
||||||
|
#include "util/u_surface.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -30,12 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "pipe/p_defines.h"
|
|
||||||
#include "pipe/p_format.h"
|
|
||||||
#include "pipe/p_context.h"
|
|
||||||
#include "pipe/p_screen.h"
|
|
||||||
#include "util/u_format.h"
|
#include "util/u_format.h"
|
||||||
#include "util/u_inlines.h"
|
|
||||||
#include "util/u_rect.h"
|
#include "util/u_rect.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -152,156 +147,3 @@ util_fill_rect(ubyte * dst,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fallback function for pipe->surface_copy().
|
|
||||||
* Note: (X,Y)=(0,0) is always the upper-left corner.
|
|
||||||
* if do_flip, flip the image vertically on its way from src rect to dst rect.
|
|
||||||
* XXX should probably put this in new u_surface.c file...
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
util_surface_copy(struct pipe_context *pipe,
|
|
||||||
boolean do_flip,
|
|
||||||
struct pipe_surface *dst,
|
|
||||||
unsigned dst_x, unsigned dst_y,
|
|
||||||
struct pipe_surface *src,
|
|
||||||
unsigned src_x, unsigned src_y,
|
|
||||||
unsigned w, unsigned h)
|
|
||||||
{
|
|
||||||
struct pipe_transfer *src_trans, *dst_trans;
|
|
||||||
void *dst_map;
|
|
||||||
const void *src_map;
|
|
||||||
enum pipe_format src_format, dst_format;
|
|
||||||
|
|
||||||
assert(src->texture && dst->texture);
|
|
||||||
if (!src->texture || !dst->texture)
|
|
||||||
return;
|
|
||||||
|
|
||||||
src_format = src->texture->format;
|
|
||||||
dst_format = dst->texture->format;
|
|
||||||
|
|
||||||
src_trans = pipe_get_transfer(pipe,
|
|
||||||
src->texture,
|
|
||||||
src->face,
|
|
||||||
src->level,
|
|
||||||
src->zslice,
|
|
||||||
PIPE_TRANSFER_READ,
|
|
||||||
src_x, src_y, w, h);
|
|
||||||
|
|
||||||
dst_trans = pipe_get_transfer(pipe,
|
|
||||||
dst->texture,
|
|
||||||
dst->face,
|
|
||||||
dst->level,
|
|
||||||
dst->zslice,
|
|
||||||
PIPE_TRANSFER_WRITE,
|
|
||||||
dst_x, dst_y, w, h);
|
|
||||||
|
|
||||||
assert(util_format_get_blocksize(dst_format) == util_format_get_blocksize(src_format));
|
|
||||||
assert(util_format_get_blockwidth(dst_format) == util_format_get_blockwidth(src_format));
|
|
||||||
assert(util_format_get_blockheight(dst_format) == util_format_get_blockheight(src_format));
|
|
||||||
|
|
||||||
src_map = pipe->transfer_map(pipe, src_trans);
|
|
||||||
dst_map = pipe->transfer_map(pipe, dst_trans);
|
|
||||||
|
|
||||||
assert(src_map);
|
|
||||||
assert(dst_map);
|
|
||||||
|
|
||||||
if (src_map && dst_map) {
|
|
||||||
/* If do_flip, invert src_y position and pass negative src stride */
|
|
||||||
util_copy_rect(dst_map,
|
|
||||||
dst_format,
|
|
||||||
dst_trans->stride,
|
|
||||||
0, 0,
|
|
||||||
w, h,
|
|
||||||
src_map,
|
|
||||||
do_flip ? -(int) src_trans->stride : src_trans->stride,
|
|
||||||
0,
|
|
||||||
do_flip ? h - 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
pipe->transfer_unmap(pipe, src_trans);
|
|
||||||
pipe->transfer_unmap(pipe, dst_trans);
|
|
||||||
|
|
||||||
pipe->transfer_destroy(pipe, src_trans);
|
|
||||||
pipe->transfer_destroy(pipe, dst_trans);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define UBYTE_TO_USHORT(B) ((B) | ((B) << 8))
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fallback for pipe->surface_fill() function.
|
|
||||||
* XXX should probably put this in new u_surface.c file...
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
util_surface_fill(struct pipe_context *pipe,
|
|
||||||
struct pipe_surface *dst,
|
|
||||||
unsigned dstx, unsigned dsty,
|
|
||||||
unsigned width, unsigned height, unsigned value)
|
|
||||||
{
|
|
||||||
struct pipe_transfer *dst_trans;
|
|
||||||
void *dst_map;
|
|
||||||
|
|
||||||
assert(dst->texture);
|
|
||||||
if (!dst->texture)
|
|
||||||
return;
|
|
||||||
dst_trans = pipe_get_transfer(pipe,
|
|
||||||
dst->texture,
|
|
||||||
dst->face,
|
|
||||||
dst->level,
|
|
||||||
dst->zslice,
|
|
||||||
PIPE_TRANSFER_WRITE,
|
|
||||||
dstx, dsty, width, height);
|
|
||||||
|
|
||||||
dst_map = pipe->transfer_map(pipe, dst_trans);
|
|
||||||
|
|
||||||
assert(dst_map);
|
|
||||||
|
|
||||||
if (dst_map) {
|
|
||||||
assert(dst_trans->stride > 0);
|
|
||||||
|
|
||||||
switch (util_format_get_blocksize(dst->texture->format)) {
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 4:
|
|
||||||
util_fill_rect(dst_map, dst->texture->format,
|
|
||||||
dst_trans->stride,
|
|
||||||
0, 0, width, height, value);
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
{
|
|
||||||
/* expand the 4-byte clear value to an 8-byte value */
|
|
||||||
ushort *row = (ushort *) dst_map;
|
|
||||||
ushort val0 = UBYTE_TO_USHORT((value >> 0) & 0xff);
|
|
||||||
ushort val1 = UBYTE_TO_USHORT((value >> 8) & 0xff);
|
|
||||||
ushort val2 = UBYTE_TO_USHORT((value >> 16) & 0xff);
|
|
||||||
ushort val3 = UBYTE_TO_USHORT((value >> 24) & 0xff);
|
|
||||||
unsigned i, j;
|
|
||||||
val0 = (val0 << 8) | val0;
|
|
||||||
val1 = (val1 << 8) | val1;
|
|
||||||
val2 = (val2 << 8) | val2;
|
|
||||||
val3 = (val3 << 8) | val3;
|
|
||||||
for (i = 0; i < height; i++) {
|
|
||||||
for (j = 0; j < width; j++) {
|
|
||||||
row[j*4+0] = val0;
|
|
||||||
row[j*4+1] = val1;
|
|
||||||
row[j*4+2] = val2;
|
|
||||||
row[j*4+3] = val3;
|
|
||||||
}
|
|
||||||
row += dst_trans->stride/2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pipe->transfer_unmap(pipe, dst_trans);
|
|
||||||
pipe->transfer_destroy(pipe, dst_trans);
|
|
||||||
}
|
|
||||||
|
@@ -37,9 +37,6 @@
|
|||||||
|
|
||||||
#include "pipe/p_format.h"
|
#include "pipe/p_format.h"
|
||||||
|
|
||||||
struct pipe_context;
|
|
||||||
struct pipe_surface;
|
|
||||||
|
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
util_copy_rect(ubyte * dst, enum pipe_format format,
|
util_copy_rect(ubyte * dst, enum pipe_format format,
|
||||||
@@ -53,20 +50,4 @@ util_fill_rect(ubyte * dst, enum pipe_format format,
|
|||||||
unsigned width, unsigned height, uint32_t value);
|
unsigned width, unsigned height, uint32_t value);
|
||||||
|
|
||||||
|
|
||||||
extern void
|
|
||||||
util_surface_copy(struct pipe_context *pipe,
|
|
||||||
boolean do_flip,
|
|
||||||
struct pipe_surface *dst,
|
|
||||||
unsigned dst_x, unsigned dst_y,
|
|
||||||
struct pipe_surface *src,
|
|
||||||
unsigned src_x, unsigned src_y,
|
|
||||||
unsigned w, unsigned h);
|
|
||||||
|
|
||||||
extern void
|
|
||||||
util_surface_fill(struct pipe_context *pipe,
|
|
||||||
struct pipe_surface *dst,
|
|
||||||
unsigned dstx, unsigned dsty,
|
|
||||||
unsigned width, unsigned height, unsigned value);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* U_RECT_H */
|
#endif /* U_RECT_H */
|
||||||
|
@@ -32,12 +32,14 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "pipe/p_defines.h"
|
||||||
#include "pipe/p_screen.h"
|
#include "pipe/p_screen.h"
|
||||||
#include "pipe/p_state.h"
|
#include "pipe/p_state.h"
|
||||||
#include "pipe/p_defines.h"
|
|
||||||
#include "util/u_inlines.h"
|
|
||||||
|
|
||||||
|
#include "util/u_format.h"
|
||||||
|
#include "util/u_inlines.h"
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
|
#include "util/u_rect.h"
|
||||||
#include "util/u_surface.h"
|
#include "util/u_surface.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -114,3 +116,154 @@ util_destroy_rgba_surface(struct pipe_resource *texture,
|
|||||||
pipe_surface_reference(&surface, NULL);
|
pipe_surface_reference(&surface, NULL);
|
||||||
pipe_resource_reference(&texture, NULL);
|
pipe_resource_reference(&texture, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fallback function for pipe->surface_copy().
|
||||||
|
* Note: (X,Y)=(0,0) is always the upper-left corner.
|
||||||
|
* if do_flip, flip the image vertically on its way from src rect to dst rect.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
util_surface_copy(struct pipe_context *pipe,
|
||||||
|
boolean do_flip,
|
||||||
|
struct pipe_surface *dst,
|
||||||
|
unsigned dst_x, unsigned dst_y,
|
||||||
|
struct pipe_surface *src,
|
||||||
|
unsigned src_x, unsigned src_y,
|
||||||
|
unsigned w, unsigned h)
|
||||||
|
{
|
||||||
|
struct pipe_transfer *src_trans, *dst_trans;
|
||||||
|
void *dst_map;
|
||||||
|
const void *src_map;
|
||||||
|
enum pipe_format src_format, dst_format;
|
||||||
|
|
||||||
|
assert(src->texture && dst->texture);
|
||||||
|
if (!src->texture || !dst->texture)
|
||||||
|
return;
|
||||||
|
|
||||||
|
src_format = src->texture->format;
|
||||||
|
dst_format = dst->texture->format;
|
||||||
|
|
||||||
|
src_trans = pipe_get_transfer(pipe,
|
||||||
|
src->texture,
|
||||||
|
src->face,
|
||||||
|
src->level,
|
||||||
|
src->zslice,
|
||||||
|
PIPE_TRANSFER_READ,
|
||||||
|
src_x, src_y, w, h);
|
||||||
|
|
||||||
|
dst_trans = pipe_get_transfer(pipe,
|
||||||
|
dst->texture,
|
||||||
|
dst->face,
|
||||||
|
dst->level,
|
||||||
|
dst->zslice,
|
||||||
|
PIPE_TRANSFER_WRITE,
|
||||||
|
dst_x, dst_y, w, h);
|
||||||
|
|
||||||
|
assert(util_format_get_blocksize(dst_format) == util_format_get_blocksize(src_format));
|
||||||
|
assert(util_format_get_blockwidth(dst_format) == util_format_get_blockwidth(src_format));
|
||||||
|
assert(util_format_get_blockheight(dst_format) == util_format_get_blockheight(src_format));
|
||||||
|
|
||||||
|
src_map = pipe->transfer_map(pipe, src_trans);
|
||||||
|
dst_map = pipe->transfer_map(pipe, dst_trans);
|
||||||
|
|
||||||
|
assert(src_map);
|
||||||
|
assert(dst_map);
|
||||||
|
|
||||||
|
if (src_map && dst_map) {
|
||||||
|
/* If do_flip, invert src_y position and pass negative src stride */
|
||||||
|
util_copy_rect(dst_map,
|
||||||
|
dst_format,
|
||||||
|
dst_trans->stride,
|
||||||
|
0, 0,
|
||||||
|
w, h,
|
||||||
|
src_map,
|
||||||
|
do_flip ? -(int) src_trans->stride : src_trans->stride,
|
||||||
|
0,
|
||||||
|
do_flip ? h - 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
pipe->transfer_unmap(pipe, src_trans);
|
||||||
|
pipe->transfer_unmap(pipe, dst_trans);
|
||||||
|
|
||||||
|
pipe->transfer_destroy(pipe, src_trans);
|
||||||
|
pipe->transfer_destroy(pipe, dst_trans);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define UBYTE_TO_USHORT(B) ((B) | ((B) << 8))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fallback for pipe->surface_fill() function.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
util_surface_fill(struct pipe_context *pipe,
|
||||||
|
struct pipe_surface *dst,
|
||||||
|
unsigned dstx, unsigned dsty,
|
||||||
|
unsigned width, unsigned height, unsigned value)
|
||||||
|
{
|
||||||
|
struct pipe_transfer *dst_trans;
|
||||||
|
void *dst_map;
|
||||||
|
|
||||||
|
assert(dst->texture);
|
||||||
|
if (!dst->texture)
|
||||||
|
return;
|
||||||
|
dst_trans = pipe_get_transfer(pipe,
|
||||||
|
dst->texture,
|
||||||
|
dst->face,
|
||||||
|
dst->level,
|
||||||
|
dst->zslice,
|
||||||
|
PIPE_TRANSFER_WRITE,
|
||||||
|
dstx, dsty, width, height);
|
||||||
|
|
||||||
|
dst_map = pipe->transfer_map(pipe, dst_trans);
|
||||||
|
|
||||||
|
assert(dst_map);
|
||||||
|
|
||||||
|
if (dst_map) {
|
||||||
|
assert(dst_trans->stride > 0);
|
||||||
|
|
||||||
|
switch (util_format_get_blocksize(dst->texture->format)) {
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 4:
|
||||||
|
util_fill_rect(dst_map, dst->texture->format,
|
||||||
|
dst_trans->stride,
|
||||||
|
0, 0, width, height, value);
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
/* expand the 4-byte clear value to an 8-byte value */
|
||||||
|
ushort *row = (ushort *) dst_map;
|
||||||
|
ushort val0 = UBYTE_TO_USHORT((value >> 0) & 0xff);
|
||||||
|
ushort val1 = UBYTE_TO_USHORT((value >> 8) & 0xff);
|
||||||
|
ushort val2 = UBYTE_TO_USHORT((value >> 16) & 0xff);
|
||||||
|
ushort val3 = UBYTE_TO_USHORT((value >> 24) & 0xff);
|
||||||
|
unsigned i, j;
|
||||||
|
val0 = (val0 << 8) | val0;
|
||||||
|
val1 = (val1 << 8) | val1;
|
||||||
|
val2 = (val2 << 8) | val2;
|
||||||
|
val3 = (val3 << 8) | val3;
|
||||||
|
for (i = 0; i < height; i++) {
|
||||||
|
for (j = 0; j < width; j++) {
|
||||||
|
row[j*4+0] = val0;
|
||||||
|
row[j*4+1] = val1;
|
||||||
|
row[j*4+2] = val2;
|
||||||
|
row[j*4+3] = val3;
|
||||||
|
}
|
||||||
|
row += dst_trans->stride/2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pipe->transfer_unmap(pipe, dst_trans);
|
||||||
|
pipe->transfer_destroy(pipe, dst_trans);
|
||||||
|
}
|
||||||
|
@@ -62,4 +62,22 @@ util_destroy_rgba_surface(struct pipe_resource *texture,
|
|||||||
struct pipe_surface *surface);
|
struct pipe_surface *surface);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern void
|
||||||
|
util_surface_copy(struct pipe_context *pipe,
|
||||||
|
boolean do_flip,
|
||||||
|
struct pipe_surface *dst,
|
||||||
|
unsigned dst_x, unsigned dst_y,
|
||||||
|
struct pipe_surface *src,
|
||||||
|
unsigned src_x, unsigned src_y,
|
||||||
|
unsigned w, unsigned h);
|
||||||
|
|
||||||
|
extern void
|
||||||
|
util_surface_fill(struct pipe_context *pipe,
|
||||||
|
struct pipe_surface *dst,
|
||||||
|
unsigned dstx, unsigned dsty,
|
||||||
|
unsigned width, unsigned height, unsigned value);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* U_SURFACE_H */
|
#endif /* U_SURFACE_H */
|
||||||
|
@@ -25,7 +25,7 @@
|
|||||||
*
|
*
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "util/u_rect.h"
|
#include "util/u_surface.h"
|
||||||
#include "cell_context.h"
|
#include "cell_context.h"
|
||||||
#include "cell_surface.h"
|
#include "cell_surface.h"
|
||||||
|
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "util/u_rect.h"
|
#include "util/u_rect.h"
|
||||||
|
#include "util/u_surface.h"
|
||||||
#include "lp_context.h"
|
#include "lp_context.h"
|
||||||
#include "lp_flush.h"
|
#include "lp_flush.h"
|
||||||
#include "lp_limits.h"
|
#include "lp_limits.h"
|
||||||
|
@@ -25,7 +25,7 @@
|
|||||||
*
|
*
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "util/u_rect.h"
|
#include "util/u_surface.h"
|
||||||
#include "sp_context.h"
|
#include "sp_context.h"
|
||||||
#include "sp_surface.h"
|
#include "sp_surface.h"
|
||||||
|
|
||||||
|
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
#include "util/u_rect.h"
|
#include "util/u_rect.h"
|
||||||
|
#include "util/u_surface.h"
|
||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
#include "pipe/p_context.h"
|
#include "pipe/p_context.h"
|
||||||
#include "state_tracker/dri1_api.h"
|
#include "state_tracker/dri1_api.h"
|
||||||
|
@@ -40,6 +40,7 @@
|
|||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
#include "util/u_rect.h"
|
#include "util/u_rect.h"
|
||||||
#include "util/u_sampler.h"
|
#include "util/u_sampler.h"
|
||||||
|
#include "util/u_surface.h"
|
||||||
|
|
||||||
#include "cso_cache/cso_context.h"
|
#include "cso_cache/cso_context.h"
|
||||||
|
|
||||||
|
@@ -46,6 +46,7 @@
|
|||||||
#include "util/u_math.h"
|
#include "util/u_math.h"
|
||||||
#include "util/u_debug.h"
|
#include "util/u_debug.h"
|
||||||
#include "util/u_format.h"
|
#include "util/u_format.h"
|
||||||
|
#include "util/u_surface.h"
|
||||||
|
|
||||||
#define DEBUG_PRINT 0
|
#define DEBUG_PRINT 0
|
||||||
#define ROUND_UP_TEXTURES 1
|
#define ROUND_UP_TEXTURES 1
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
#include "util/u_rect.h"
|
#include "util/u_rect.h"
|
||||||
#include "util/u_sampler.h"
|
#include "util/u_sampler.h"
|
||||||
|
#include "util/u_surface.h"
|
||||||
|
|
||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
|
|
||||||
|
@@ -64,6 +64,7 @@
|
|||||||
#include "pipe/p_context.h"
|
#include "pipe/p_context.h"
|
||||||
#include "util/u_inlines.h"
|
#include "util/u_inlines.h"
|
||||||
#include "util/u_rect.h"
|
#include "util/u_rect.h"
|
||||||
|
#include "util/u_surface.h"
|
||||||
#include "draw/draw_context.h"
|
#include "draw/draw_context.h"
|
||||||
#include "cso_cache/cso_context.h"
|
#include "cso_cache/cso_context.h"
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user