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_sampler.h"
|
||||
#include "util/u_simple_shaders.h"
|
||||
#include "util/u_surface.h"
|
||||
#include "util/u_texture.h"
|
||||
|
||||
#define INVALID_PTR ((void*)~0)
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include "pipe/p_state.h"
|
||||
#include "util/u_pack_color.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_inlines.h"
|
||||
#include "util/u_rect.h"
|
||||
|
||||
|
||||
@@ -152,156 +147,3 @@ util_fill_rect(ubyte * dst,
|
||||
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"
|
||||
|
||||
struct pipe_context;
|
||||
struct pipe_surface;
|
||||
|
||||
|
||||
extern void
|
||||
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);
|
||||
|
||||
|
||||
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 */
|
||||
|
@@ -32,12 +32,14 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "pipe/p_defines.h"
|
||||
#include "pipe/p_screen.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_rect.h"
|
||||
#include "util/u_surface.h"
|
||||
|
||||
|
||||
@@ -114,3 +116,154 @@ util_destroy_rgba_surface(struct pipe_resource *texture,
|
||||
pipe_surface_reference(&surface, 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);
|
||||
|
||||
|
||||
|
||||
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 */
|
||||
|
@@ -25,7 +25,7 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include "util/u_rect.h"
|
||||
#include "util/u_surface.h"
|
||||
#include "cell_context.h"
|
||||
#include "cell_surface.h"
|
||||
|
||||
|
@@ -26,6 +26,7 @@
|
||||
**************************************************************************/
|
||||
|
||||
#include "util/u_rect.h"
|
||||
#include "util/u_surface.h"
|
||||
#include "lp_context.h"
|
||||
#include "lp_flush.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_surface.h"
|
||||
|
||||
|
@@ -33,6 +33,7 @@
|
||||
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_rect.h"
|
||||
#include "util/u_surface.h"
|
||||
#include "util/u_inlines.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "state_tracker/dri1_api.h"
|
||||
|
@@ -40,6 +40,7 @@
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_rect.h"
|
||||
#include "util/u_sampler.h"
|
||||
#include "util/u_surface.h"
|
||||
|
||||
#include "cso_cache/cso_context.h"
|
||||
|
||||
|
@@ -46,6 +46,7 @@
|
||||
#include "util/u_math.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "util/u_format.h"
|
||||
#include "util/u_surface.h"
|
||||
|
||||
#define DEBUG_PRINT 0
|
||||
#define ROUND_UP_TEXTURES 1
|
||||
|
@@ -9,6 +9,7 @@
|
||||
#include "util/u_memory.h"
|
||||
#include "util/u_rect.h"
|
||||
#include "util/u_sampler.h"
|
||||
#include "util/u_surface.h"
|
||||
|
||||
#include "util/u_inlines.h"
|
||||
|
||||
|
@@ -64,6 +64,7 @@
|
||||
#include "pipe/p_context.h"
|
||||
#include "util/u_inlines.h"
|
||||
#include "util/u_rect.h"
|
||||
#include "util/u_surface.h"
|
||||
#include "draw/draw_context.h"
|
||||
#include "cso_cache/cso_context.h"
|
||||
|
||||
|
Reference in New Issue
Block a user