[Mesa-dev] [PATCH 1/2] gallium/sw: allow for negative strides in some places
Dave Airlie
airlied at gmail.com
Mon Mar 18 21:40:36 PDT 2013
From: Dave Airlie <airlied at redhat.com>
This is for a specific use-case for the QXL driver (which wraps
llvmpipe/softpipe). Texture it get via TFP are inverted, so
we need to use a negative stride to sample from them. So
this converts a bunch of cases where we use unsigned stride
to a signed value. I can't see the single bit less limiting
us anytime soon, and so far the underlying llvm code has
just worked properly and my texture samples end the right way up.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/gallium/auxiliary/draw/draw_context.c | 2 +-
src/gallium/auxiliary/draw/draw_context.h | 2 +-
src/gallium/auxiliary/draw/draw_llvm.c | 2 +-
src/gallium/auxiliary/draw/draw_llvm.h | 4 ++--
src/gallium/drivers/llvmpipe/lp_jit.h | 2 +-
src/gallium/drivers/llvmpipe/lp_scene.h | 2 +-
src/gallium/drivers/llvmpipe/lp_state_sampler.c | 2 +-
src/gallium/drivers/llvmpipe/lp_texture.h | 2 +-
src/gallium/include/pipe/p_state.h | 2 +-
src/gallium/include/state_tracker/sw_winsys.h | 4 ++--
src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c | 8 ++++----
src/gallium/winsys/sw/xlib/xlib_sw_winsys.c | 6 +++---
12 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c
index 045bb6b..0903cfb 100644
--- a/src/gallium/auxiliary/draw/draw_context.c
+++ b/src/gallium/auxiliary/draw/draw_context.c
@@ -807,7 +807,7 @@ draw_set_mapped_texture(struct draw_context *draw,
uint32_t width, uint32_t height, uint32_t depth,
uint32_t first_level, uint32_t last_level,
const void *base_ptr,
- uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
+ int32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS])
{
diff --git a/src/gallium/auxiliary/draw/draw_context.h b/src/gallium/auxiliary/draw/draw_context.h
index e8e2d94..4927ca4 100644
--- a/src/gallium/auxiliary/draw/draw_context.h
+++ b/src/gallium/auxiliary/draw/draw_context.h
@@ -155,7 +155,7 @@ draw_set_mapped_texture(struct draw_context *draw,
uint32_t width, uint32_t height, uint32_t depth,
uint32_t first_level, uint32_t last_level,
const void *base,
- uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
+ int32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS]);
diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c
index 8e46687..3e7d497 100644
--- a/src/gallium/auxiliary/draw/draw_llvm.c
+++ b/src/gallium/auxiliary/draw/draw_llvm.c
@@ -1501,7 +1501,7 @@ draw_llvm_set_mapped_texture(struct draw_context *draw,
uint32_t width, uint32_t height, uint32_t depth,
uint32_t first_level, uint32_t last_level,
const void *base_ptr,
- uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
+ int32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS])
{
diff --git a/src/gallium/auxiliary/draw/draw_llvm.h b/src/gallium/auxiliary/draw/draw_llvm.h
index c9f125b..748a01b 100644
--- a/src/gallium/auxiliary/draw/draw_llvm.h
+++ b/src/gallium/auxiliary/draw/draw_llvm.h
@@ -49,7 +49,7 @@ struct draw_jit_texture
uint32_t first_level;
uint32_t last_level;
const void *base;
- uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
+ int32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS];
uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS];
};
@@ -337,7 +337,7 @@ draw_llvm_set_mapped_texture(struct draw_context *draw,
uint32_t width, uint32_t height, uint32_t depth,
uint32_t first_level, uint32_t last_level,
const void *base_ptr,
- uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
+ int32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS]);
diff --git a/src/gallium/drivers/llvmpipe/lp_jit.h b/src/gallium/drivers/llvmpipe/lp_jit.h
index 4eddb2a..ea89124 100644
--- a/src/gallium/drivers/llvmpipe/lp_jit.h
+++ b/src/gallium/drivers/llvmpipe/lp_jit.h
@@ -55,7 +55,7 @@ struct lp_jit_texture
uint32_t first_level;
uint32_t last_level;
const void *base;
- uint32_t row_stride[LP_MAX_TEXTURE_LEVELS];
+ int32_t row_stride[LP_MAX_TEXTURE_LEVELS];
uint32_t img_stride[LP_MAX_TEXTURE_LEVELS];
uint32_t mip_offsets[LP_MAX_TEXTURE_LEVELS];
};
diff --git a/src/gallium/drivers/llvmpipe/lp_scene.h b/src/gallium/drivers/llvmpipe/lp_scene.h
index b1db61b..2ff8b5b 100644
--- a/src/gallium/drivers/llvmpipe/lp_scene.h
+++ b/src/gallium/drivers/llvmpipe/lp_scene.h
@@ -134,7 +134,7 @@ struct lp_scene {
*/
struct {
uint8_t *map;
- unsigned stride;
+ int32_t stride;
unsigned blocksize;
} zsbuf, cbufs[PIPE_MAX_COLOR_BUFS];
diff --git a/src/gallium/drivers/llvmpipe/lp_state_sampler.c b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
index 30547a6..658d7cd 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_sampler.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
@@ -253,7 +253,7 @@ llvmpipe_prepare_vertex_sampling(struct llvmpipe_context *lp,
struct pipe_sampler_view **views)
{
unsigned i;
- uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
+ int32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS];
uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS];
const void *addr;
diff --git a/src/gallium/drivers/llvmpipe/lp_texture.h b/src/gallium/drivers/llvmpipe/lp_texture.h
index c046902..1bdccce 100644
--- a/src/gallium/drivers/llvmpipe/lp_texture.h
+++ b/src/gallium/drivers/llvmpipe/lp_texture.h
@@ -87,7 +87,7 @@ struct llvmpipe_resource
struct pipe_resource base;
/** Row stride in bytes */
- unsigned row_stride[LP_MAX_TEXTURE_LEVELS];
+ int row_stride[LP_MAX_TEXTURE_LEVELS];
/** Image stride (for cube maps, array or 3D textures) in bytes */
unsigned img_stride[LP_MAX_TEXTURE_LEVELS];
unsigned tiles_per_row[LP_MAX_TEXTURE_LEVELS];
diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
index ab49cab..9201cfe 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -426,7 +426,7 @@ struct pipe_transfer
unsigned level; /**< texture mipmap level */
enum pipe_transfer_usage usage;
struct pipe_box box; /**< region of the resource to access */
- unsigned stride; /**< row stride in bytes */
+ int stride; /**< row stride in bytes */
unsigned layer_stride; /**< image/layer stride in bytes */
};
diff --git a/src/gallium/include/state_tracker/sw_winsys.h b/src/gallium/include/state_tracker/sw_winsys.h
index 0b11fe3..71d2943 100644
--- a/src/gallium/include/state_tracker/sw_winsys.h
+++ b/src/gallium/include/state_tracker/sw_winsys.h
@@ -90,7 +90,7 @@ struct sw_winsys
enum pipe_format format,
unsigned width, unsigned height,
unsigned alignment,
- unsigned *stride );
+ int *stride );
/**
* Used to implement texture_from_handle.
@@ -99,7 +99,7 @@ struct sw_winsys
(*displaytarget_from_handle)( struct sw_winsys *ws,
const struct pipe_resource *templat,
struct winsys_handle *whandle,
- unsigned *stride );
+ int *stride );
/**
* Used to implement texture_get_handle.
diff --git a/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c b/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c
index e552ac2..3761ae0 100644
--- a/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c
+++ b/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c
@@ -85,7 +85,7 @@ wrapper_sw_displaytarget(struct sw_displaytarget *dt)
static boolean
-wsw_dt_get_stride(struct wrapper_sw_displaytarget *wdt, unsigned *stride)
+wsw_dt_get_stride(struct wrapper_sw_displaytarget *wdt, int *stride)
{
struct pipe_context *pipe = wdt->winsys->pipe;
struct pipe_resource *tex = wdt->tex;
@@ -108,7 +108,7 @@ wsw_dt_get_stride(struct wrapper_sw_displaytarget *wdt, unsigned *stride)
static struct sw_displaytarget *
wsw_dt_wrap_texture(struct wrapper_sw_winsys *wsw,
- struct pipe_resource *tex, unsigned *stride)
+ struct pipe_resource *tex, int *stride)
{
struct wrapper_sw_displaytarget *wdt = CALLOC_STRUCT(wrapper_sw_displaytarget);
if (!wdt)
@@ -135,7 +135,7 @@ wsw_dt_create(struct sw_winsys *ws,
enum pipe_format format,
unsigned width, unsigned height,
unsigned alignment,
- unsigned *stride)
+ int *stride)
{
struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws);
struct pipe_resource templ;
@@ -166,7 +166,7 @@ static struct sw_displaytarget *
wsw_dt_from_handle(struct sw_winsys *ws,
const struct pipe_resource *templ,
struct winsys_handle *whandle,
- unsigned *stride)
+ int *stride)
{
struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws);
struct pipe_resource *tex;
diff --git a/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c b/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c
index 3aef8da..de6816f 100644
--- a/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c
+++ b/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c
@@ -59,7 +59,7 @@ struct xlib_displaytarget
enum pipe_format format;
unsigned width;
unsigned height;
- unsigned stride;
+ int stride;
void *data;
void *mapped;
@@ -383,7 +383,7 @@ xlib_displaytarget_create(struct sw_winsys *winsys,
enum pipe_format format,
unsigned width, unsigned height,
unsigned alignment,
- unsigned *stride)
+ int *stride)
{
struct xlib_displaytarget *xlib_dt;
unsigned nblocksy, size;
@@ -428,7 +428,7 @@ static struct sw_displaytarget *
xlib_displaytarget_from_handle(struct sw_winsys *winsys,
const struct pipe_resource *templet,
struct winsys_handle *whandle,
- unsigned *stride)
+ int *stride)
{
assert(0);
return NULL;
--
1.8.1.4
More information about the mesa-dev
mailing list