mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 04:30:10 +01:00
Remove mapping fields from struct pipe_surface.
It's now the responsibility of surface users to keep track of their mappings.
This commit is contained in:
parent
a511200e5f
commit
c76efb96b4
17 changed files with 191 additions and 322 deletions
|
|
@ -171,10 +171,10 @@ i915_surface_copy(struct pipe_context *pipe,
|
|||
/* Fill a rectangular sub-region. Need better logic about when to
|
||||
* push buffers into AGP - will currently do so whenever possible.
|
||||
*/
|
||||
static ubyte *
|
||||
get_pointer(struct pipe_surface *dst, unsigned x, unsigned y)
|
||||
static void *
|
||||
get_pointer(struct pipe_surface *dst, void *dst_map, unsigned x, unsigned y)
|
||||
{
|
||||
return dst->map + (y * dst->pitch + x) * dst->cpp;
|
||||
return (char *)dst_map + (y * dst->pitch + x) * dst->cpp;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -186,12 +186,11 @@ i915_surface_fill(struct pipe_context *pipe,
|
|||
{
|
||||
if (0) {
|
||||
unsigned i, j;
|
||||
|
||||
(void)pipe_surface_map(dst);
|
||||
void *dst_map = pipe_surface_map(dst);
|
||||
|
||||
switch (dst->cpp) {
|
||||
case 1: {
|
||||
ubyte *row = get_pointer(dst, dstx, dsty);
|
||||
ubyte *row = get_pointer(dst, dst_map, dstx, dsty);
|
||||
for (i = 0; i < height; i++) {
|
||||
memset(row, value, width);
|
||||
row += dst->pitch;
|
||||
|
|
@ -199,7 +198,7 @@ i915_surface_fill(struct pipe_context *pipe,
|
|||
}
|
||||
break;
|
||||
case 2: {
|
||||
ushort *row = (ushort *) get_pointer(dst, dstx, dsty);
|
||||
ushort *row = get_pointer(dst, dst_map, dstx, dsty);
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++)
|
||||
row[j] = (ushort) value;
|
||||
|
|
@ -208,7 +207,7 @@ i915_surface_fill(struct pipe_context *pipe,
|
|||
}
|
||||
break;
|
||||
case 4: {
|
||||
unsigned *row = (unsigned *) get_pointer(dst, dstx, dsty);
|
||||
unsigned *row = get_pointer(dst, dst_map, dstx, dsty);
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++)
|
||||
row[j] = value;
|
||||
|
|
@ -220,6 +219,8 @@ i915_surface_fill(struct pipe_context *pipe,
|
|||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
pipe_surface_unmap( dst );
|
||||
}
|
||||
else {
|
||||
i915_fill_blit( i915_context(pipe),
|
||||
|
|
|
|||
|
|
@ -171,10 +171,10 @@ brw_surface_copy(struct pipe_context *pipe,
|
|||
/* Fill a rectangular sub-region. Need better logic about when to
|
||||
* push buffers into AGP - will currently do so whenever possible.
|
||||
*/
|
||||
static ubyte *
|
||||
get_pointer(struct pipe_surface *dst, unsigned x, unsigned y)
|
||||
static void *
|
||||
get_pointer(struct pipe_surface *dst, void *dst_map, unsigned x, unsigned y)
|
||||
{
|
||||
return dst->map + (y * dst->pitch + x) * dst->cpp;
|
||||
return (char *)dst_map + (y * dst->pitch + x) * dst->cpp;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -186,12 +186,11 @@ brw_surface_fill(struct pipe_context *pipe,
|
|||
{
|
||||
if (0) {
|
||||
unsigned i, j;
|
||||
|
||||
(void)pipe_surface_map(dst);
|
||||
void *dst_map = pipe_surface_map(dst);
|
||||
|
||||
switch (dst->cpp) {
|
||||
case 1: {
|
||||
ubyte *row = get_pointer(dst, dstx, dsty);
|
||||
ubyte *row = get_pointer(dst, dst_map, dstx, dsty);
|
||||
for (i = 0; i < height; i++) {
|
||||
memset(row, value, width);
|
||||
row += dst->pitch;
|
||||
|
|
@ -199,7 +198,7 @@ brw_surface_fill(struct pipe_context *pipe,
|
|||
}
|
||||
break;
|
||||
case 2: {
|
||||
ushort *row = (ushort *) get_pointer(dst, dstx, dsty);
|
||||
ushort *row = get_pointer(dst, dst_map, dstx, dsty);
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++)
|
||||
row[j] = (ushort) value;
|
||||
|
|
@ -208,7 +207,7 @@ brw_surface_fill(struct pipe_context *pipe,
|
|||
}
|
||||
break;
|
||||
case 4: {
|
||||
unsigned *row = (unsigned *) get_pointer(dst, dstx, dsty);
|
||||
unsigned *row = get_pointer(dst, dst_map, dstx, dsty);
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++)
|
||||
row[j] = value;
|
||||
|
|
@ -220,6 +219,8 @@ brw_surface_fill(struct pipe_context *pipe,
|
|||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
pipe_surface_unmap( dst );
|
||||
}
|
||||
else {
|
||||
brw_fill_blit(brw_context(pipe),
|
||||
|
|
|
|||
|
|
@ -194,9 +194,9 @@ struct pipe_context {
|
|||
const void *p, int src_stride);
|
||||
/* XXX temporary here, move these to softpipe */
|
||||
void (*get_tile_rgba)(struct pipe_context *pipe, struct pipe_surface *ps,
|
||||
uint x, uint y, uint w, uint h, float *p);
|
||||
uint x, uint y, uint w, uint h, float *p);
|
||||
void (*put_tile_rgba)(struct pipe_context *pipe, struct pipe_surface *ps,
|
||||
uint x, uint y, uint w, uint h, const float *p);
|
||||
uint x, uint y, uint w, uint h, const float *p);
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -33,35 +33,21 @@
|
|||
#include "p_winsys.h"
|
||||
|
||||
|
||||
static INLINE ubyte *
|
||||
static INLINE void *
|
||||
pipe_surface_map(struct pipe_surface *surface)
|
||||
{
|
||||
if (!surface->map_refcount++) {
|
||||
surface->map
|
||||
= (ubyte *) surface->winsys->buffer_map( surface->winsys,
|
||||
surface->buffer,
|
||||
PIPE_BUFFER_FLAG_WRITE |
|
||||
PIPE_BUFFER_FLAG_READ )
|
||||
+ surface->offset;
|
||||
}
|
||||
|
||||
return surface->map;
|
||||
return (char *)surface->winsys->buffer_map( surface->winsys, surface->buffer,
|
||||
PIPE_BUFFER_FLAG_WRITE |
|
||||
PIPE_BUFFER_FLAG_READ )
|
||||
+ surface->offset;
|
||||
}
|
||||
|
||||
static INLINE void
|
||||
pipe_surface_unmap(struct pipe_surface *surface)
|
||||
{
|
||||
if (surface->map_refcount > 0) {
|
||||
assert(surface->map);
|
||||
if (!--surface->map_refcount) {
|
||||
surface->winsys->buffer_unmap( surface->winsys,
|
||||
surface->buffer );
|
||||
surface->map = NULL;
|
||||
}
|
||||
}
|
||||
surface->winsys->buffer_unmap( surface->winsys, surface->buffer );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set 'ptr' to point to 'surf' and update reference counting.
|
||||
* The old thing pointed to, if any, will be unreferenced first.
|
||||
|
|
|
|||
|
|
@ -242,8 +242,6 @@ struct pipe_sampler_state
|
|||
struct pipe_surface
|
||||
{
|
||||
struct pipe_buffer_handle *buffer; /**< driver private buffer handle */
|
||||
ubyte *map; /**< only non-NULL when surface is actually mapped */
|
||||
unsigned map_refcount; /**< Reference count for mapping */
|
||||
enum pipe_format format; /**< PIPE_FORMAT_x */
|
||||
unsigned cpp; /**< bytes per pixel */
|
||||
unsigned width, height;
|
||||
|
|
|
|||
|
|
@ -75,22 +75,15 @@ softpipe_is_format_supported( struct pipe_context *pipe,
|
|||
void
|
||||
softpipe_map_surfaces(struct softpipe_context *sp)
|
||||
{
|
||||
struct pipe_surface *ps;
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < sp->framebuffer.num_cbufs; i++) {
|
||||
ps = sp->framebuffer.cbufs[i];
|
||||
if (ps->buffer && !ps->map)
|
||||
pipe_surface_map(ps);
|
||||
sp_tile_cache_map_surfaces(sp->cbuf_cache[i]);
|
||||
}
|
||||
|
||||
ps = sp->framebuffer.zbuf;
|
||||
if (ps && ps->buffer && !ps->map)
|
||||
pipe_surface_map(ps);
|
||||
sp_tile_cache_map_surfaces(sp->zbuf_cache);
|
||||
|
||||
ps = sp->framebuffer.sbuf;
|
||||
if (ps && ps->buffer && !ps->map)
|
||||
pipe_surface_map(ps);
|
||||
sp_tile_cache_map_surfaces(sp->sbuf_cache);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -100,7 +93,6 @@ softpipe_map_surfaces(struct softpipe_context *sp)
|
|||
void
|
||||
softpipe_unmap_surfaces(struct softpipe_context *sp)
|
||||
{
|
||||
struct pipe_surface *ps;
|
||||
uint i;
|
||||
|
||||
for (i = 0; i < sp->framebuffer.num_cbufs; i++)
|
||||
|
|
@ -109,18 +101,12 @@ softpipe_unmap_surfaces(struct softpipe_context *sp)
|
|||
sp_flush_tile_cache(sp, sp->sbuf_cache);
|
||||
|
||||
for (i = 0; i < sp->framebuffer.num_cbufs; i++) {
|
||||
ps = sp->framebuffer.cbufs[i];
|
||||
if (ps->map)
|
||||
pipe_surface_unmap(ps);
|
||||
sp_tile_cache_unmap_surfaces(sp->cbuf_cache[i]);
|
||||
}
|
||||
|
||||
ps = sp->framebuffer.zbuf;
|
||||
if (ps && ps->map)
|
||||
pipe_surface_unmap(ps);
|
||||
sp_tile_cache_unmap_surfaces(sp->zbuf_cache);
|
||||
|
||||
ps = sp->framebuffer.sbuf;
|
||||
if (ps && ps->map)
|
||||
pipe_surface_unmap(ps);
|
||||
sp_tile_cache_unmap_surfaces(sp->sbuf_cache);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@
|
|||
/**
|
||||
* XXX this might get moved someday
|
||||
* Set the framebuffer surface info: color buffers, zbuffer, stencil buffer.
|
||||
* Here, we map the surfaces and update the tile cache to point to the new
|
||||
* Here, we flush the old surfaces and update the tile cache to point to the new
|
||||
* surfaces.
|
||||
*/
|
||||
void
|
||||
|
|
@ -46,7 +46,6 @@ softpipe_set_framebuffer_state(struct pipe_context *pipe,
|
|||
const struct pipe_framebuffer_state *fb)
|
||||
{
|
||||
struct softpipe_context *sp = softpipe_context(pipe);
|
||||
struct pipe_surface *ps;
|
||||
uint i;
|
||||
|
||||
for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
|
||||
|
|
@ -54,19 +53,12 @@ softpipe_set_framebuffer_state(struct pipe_context *pipe,
|
|||
if (sp->framebuffer.cbufs[i] != fb->cbufs[i]) {
|
||||
/* flush old */
|
||||
sp_flush_tile_cache(sp, sp->cbuf_cache[i]);
|
||||
/* unmap old */
|
||||
ps = sp->framebuffer.cbufs[i];
|
||||
if (ps && ps->map)
|
||||
pipe_surface_unmap(ps);
|
||||
/* map new */
|
||||
ps = fb->cbufs[i];
|
||||
if (ps)
|
||||
pipe_surface_map(ps);
|
||||
|
||||
/* assign new */
|
||||
sp->framebuffer.cbufs[i] = fb->cbufs[i];
|
||||
|
||||
/* update cache */
|
||||
sp_tile_cache_set_surface(sp->cbuf_cache[i], ps);
|
||||
sp_tile_cache_set_surface(sp->cbuf_cache[i], fb->cbufs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -76,23 +68,12 @@ softpipe_set_framebuffer_state(struct pipe_context *pipe,
|
|||
if (sp->framebuffer.zbuf != fb->zbuf) {
|
||||
/* flush old */
|
||||
sp_flush_tile_cache(sp, sp->zbuf_cache);
|
||||
/* unmap old */
|
||||
ps = sp->framebuffer.zbuf;
|
||||
if (ps && ps->map)
|
||||
pipe_surface_unmap(ps);
|
||||
if (sp->framebuffer.sbuf == sp->framebuffer.zbuf) {
|
||||
/* combined z/stencil */
|
||||
sp->framebuffer.sbuf = NULL;
|
||||
}
|
||||
/* map new */
|
||||
ps = fb->zbuf;
|
||||
if (ps)
|
||||
pipe_surface_map(ps);
|
||||
|
||||
/* assign new */
|
||||
sp->framebuffer.zbuf = fb->zbuf;
|
||||
|
||||
/* update cache */
|
||||
sp_tile_cache_set_surface(sp->zbuf_cache, ps);
|
||||
sp_tile_cache_set_surface(sp->zbuf_cache, fb->zbuf);
|
||||
}
|
||||
|
||||
/* XXX combined depth/stencil here */
|
||||
|
|
@ -101,14 +82,7 @@ softpipe_set_framebuffer_state(struct pipe_context *pipe,
|
|||
if (sp->framebuffer.sbuf != fb->sbuf) {
|
||||
/* flush old */
|
||||
sp_flush_tile_cache(sp, sp->sbuf_cache_sep);
|
||||
/* unmap old */
|
||||
ps = sp->framebuffer.sbuf;
|
||||
if (ps && ps->map)
|
||||
pipe_surface_unmap(ps);
|
||||
/* map new */
|
||||
ps = fb->sbuf;
|
||||
if (ps && fb->sbuf != fb->zbuf)
|
||||
pipe_surface_map(ps);
|
||||
|
||||
/* assign new */
|
||||
sp->framebuffer.sbuf = fb->sbuf;
|
||||
|
||||
|
|
@ -116,12 +90,12 @@ softpipe_set_framebuffer_state(struct pipe_context *pipe,
|
|||
if (fb->sbuf != fb->zbuf) {
|
||||
/* separate stencil buf */
|
||||
sp->sbuf_cache = sp->sbuf_cache_sep;
|
||||
sp_tile_cache_set_surface(sp->sbuf_cache, ps);
|
||||
sp_tile_cache_set_surface(sp->sbuf_cache, fb->sbuf);
|
||||
}
|
||||
else {
|
||||
/* combined depth/stencil */
|
||||
sp->sbuf_cache = sp->zbuf_cache;
|
||||
sp_tile_cache_set_surface(sp->sbuf_cache, ps);
|
||||
sp_tile_cache_set_surface(sp->sbuf_cache, fb->sbuf);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -158,10 +158,10 @@ sp_surface_copy(struct pipe_context *pipe,
|
|||
}
|
||||
|
||||
|
||||
static ubyte *
|
||||
get_pointer(struct pipe_surface *dst, unsigned x, unsigned y)
|
||||
static void *
|
||||
get_pointer(struct pipe_surface *dst, void *dst_map, unsigned x, unsigned y)
|
||||
{
|
||||
return dst->map + (y * dst->pitch + x) * dst->cpp;
|
||||
return (char *)dst_map + (y * dst->pitch + x) * dst->cpp;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -179,16 +179,16 @@ sp_surface_fill(struct pipe_context *pipe,
|
|||
unsigned width, unsigned height, unsigned value)
|
||||
{
|
||||
unsigned i, j;
|
||||
void *dst_map = pipe_surface_map(dst);
|
||||
|
||||
assert(dst->pitch > 0);
|
||||
assert(width <= dst->pitch);
|
||||
|
||||
(void)pipe_surface_map(dst);
|
||||
|
||||
switch (dst->cpp) {
|
||||
case 1:
|
||||
{
|
||||
ubyte *row = get_pointer(dst, dstx, dsty);
|
||||
ubyte *row = get_pointer(dst, dst_map, dstx, dsty);
|
||||
for (i = 0; i < height; i++) {
|
||||
memset(row, value, width);
|
||||
row += dst->pitch;
|
||||
|
|
@ -197,7 +197,7 @@ sp_surface_fill(struct pipe_context *pipe,
|
|||
break;
|
||||
case 2:
|
||||
{
|
||||
ushort *row = (ushort *) get_pointer(dst, dstx, dsty);
|
||||
ushort *row = get_pointer(dst, dst_map, dstx, dsty);
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++)
|
||||
row[j] = (ushort) value;
|
||||
|
|
@ -207,7 +207,7 @@ sp_surface_fill(struct pipe_context *pipe,
|
|||
break;
|
||||
case 4:
|
||||
{
|
||||
unsigned *row = (unsigned *) get_pointer(dst, dstx, dsty);
|
||||
unsigned *row = get_pointer(dst, dst_map, dstx, dsty);
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++)
|
||||
row[j] = value;
|
||||
|
|
@ -218,7 +218,7 @@ sp_surface_fill(struct pipe_context *pipe,
|
|||
case 8:
|
||||
{
|
||||
/* expand the 4-byte clear value to an 8-byte value */
|
||||
ushort *row = (ushort *) get_pointer(dst, dstx, dsty);
|
||||
ushort *row = (ushort *) get_pointer(dst, dst_map, dstx, dsty);
|
||||
ushort val0 = UBYTE_TO_USHORT((value >> 0) & 0xff);
|
||||
ushort val1 = UBYTE_TO_USHORT((value >> 8) & 0xff);
|
||||
ushort val2 = UBYTE_TO_USHORT((value >> 16) & 0xff);
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@
|
|||
struct softpipe_tile_cache
|
||||
{
|
||||
struct pipe_surface *surface; /**< the surface we're caching */
|
||||
void *surface_map;
|
||||
struct pipe_texture *texture; /**< if caching a texture */
|
||||
struct softpipe_cached_tile entries[NUM_ENTRIES];
|
||||
uint clear_flags[(MAX_WIDTH / TILE_SIZE) * (MAX_HEIGHT / TILE_SIZE) / 32];
|
||||
|
|
@ -57,6 +58,7 @@ struct softpipe_tile_cache
|
|||
boolean depth_stencil; /** Is the surface a depth/stencil format? */
|
||||
|
||||
struct pipe_surface *tex_surf;
|
||||
void *tex_surf_map;
|
||||
int tex_face, tex_level, tex_z;
|
||||
|
||||
struct softpipe_cached_tile tile; /**< scratch tile for clears */
|
||||
|
|
@ -150,7 +152,7 @@ sp_tile_cache_set_surface(struct softpipe_tile_cache *tc,
|
|||
{
|
||||
assert(!tc->texture);
|
||||
|
||||
if (tc->surface && tc->surface->map) {
|
||||
if (tc->surface_map) {
|
||||
/*assert(tc->surface != ps);*/
|
||||
pipe_surface_unmap(tc->surface);
|
||||
}
|
||||
|
|
@ -158,8 +160,8 @@ sp_tile_cache_set_surface(struct softpipe_tile_cache *tc,
|
|||
pipe_surface_reference(&tc->surface, ps);
|
||||
|
||||
if (ps) {
|
||||
if (!ps->map)
|
||||
pipe_surface_map(ps);
|
||||
if (tc->surface_map)
|
||||
tc->surface_map = pipe_surface_map(ps);
|
||||
|
||||
tc->depth_stencil = (ps->format == PIPE_FORMAT_S8Z24_UNORM ||
|
||||
ps->format == PIPE_FORMAT_Z16_UNORM ||
|
||||
|
|
@ -179,6 +181,32 @@ sp_tile_cache_get_surface(struct softpipe_tile_cache *tc)
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
sp_tile_cache_map_surfaces(struct softpipe_tile_cache *tc)
|
||||
{
|
||||
if (tc->surface && !tc->surface_map)
|
||||
tc->surface_map = pipe_surface_map(tc->surface);
|
||||
|
||||
if (tc->tex_surf && !tc->tex_surf_map)
|
||||
tc->tex_surf_map = pipe_surface_map(tc->tex_surf);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
sp_tile_cache_unmap_surfaces(struct softpipe_tile_cache *tc)
|
||||
{
|
||||
if (tc->surface_map) {
|
||||
pipe_surface_unmap(tc->surface);
|
||||
tc->surface_map = NULL;
|
||||
}
|
||||
|
||||
if (tc->tex_surf_map) {
|
||||
pipe_surface_unmap(tc->tex_surf);
|
||||
tc->tex_surf_map = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Specify the texture to cache.
|
||||
*/
|
||||
|
|
@ -192,8 +220,10 @@ sp_tile_cache_set_texture(struct softpipe_tile_cache *tc,
|
|||
|
||||
tc->texture = texture;
|
||||
|
||||
if (tc->tex_surf && tc->tex_surf->map)
|
||||
if (tc->tex_surf_map) {
|
||||
pipe_surface_unmap(tc->tex_surf);
|
||||
tc->tex_surf_map = NULL;
|
||||
}
|
||||
pipe_surface_reference(&tc->tex_surf, NULL);
|
||||
|
||||
/* mark as entries as invalid/empty */
|
||||
|
|
@ -330,9 +360,6 @@ sp_flush_tile_cache(struct softpipe_context *softpipe,
|
|||
if (!ps || !ps->buffer)
|
||||
return;
|
||||
|
||||
if (!ps->map)
|
||||
pipe_surface_map(ps);
|
||||
|
||||
for (pos = 0; pos < NUM_ENTRIES; pos++) {
|
||||
struct softpipe_cached_tile *tile = tc->entries + pos;
|
||||
if (tile->x >= 0) {
|
||||
|
|
@ -475,11 +502,11 @@ sp_get_cached_tile_tex(struct pipe_context *pipe,
|
|||
tc->tex_z != z) {
|
||||
/* get new surface (view into texture) */
|
||||
|
||||
if (tc->tex_surf && tc->tex_surf->map)
|
||||
if (tc->tex_surf_map)
|
||||
pipe_surface_unmap(tc->tex_surf);
|
||||
|
||||
tc->tex_surf = pipe->get_tex_surface(pipe, tc->texture, face, level, z);
|
||||
pipe_surface_map(tc->tex_surf);
|
||||
tc->tex_surf_map = pipe_surface_map(tc->tex_surf);
|
||||
|
||||
tc->tex_face = face;
|
||||
tc->tex_level = level;
|
||||
|
|
|
|||
|
|
@ -73,6 +73,12 @@ sp_tile_cache_set_surface(struct softpipe_tile_cache *tc,
|
|||
extern struct pipe_surface *
|
||||
sp_tile_cache_get_surface(struct softpipe_tile_cache *tc);
|
||||
|
||||
extern void
|
||||
sp_tile_cache_map_surfaces(struct softpipe_tile_cache *tc);
|
||||
|
||||
extern void
|
||||
sp_tile_cache_unmap_surfaces(struct softpipe_tile_cache *tc);
|
||||
|
||||
extern void
|
||||
sp_tile_cache_set_texture(struct softpipe_tile_cache *tc,
|
||||
struct pipe_texture *texture);
|
||||
|
|
|
|||
|
|
@ -56,8 +56,6 @@ pipe_get_tile_raw(struct pipe_context *pipe,
|
|||
ubyte *pDest;
|
||||
uint i;
|
||||
|
||||
assert(ps->map);
|
||||
|
||||
if (dst_stride == 0) {
|
||||
dst_stride = w * cpp;
|
||||
}
|
||||
|
|
@ -65,7 +63,7 @@ pipe_get_tile_raw(struct pipe_context *pipe,
|
|||
if (pipe_clip_tile(x, y, &w, &h, ps))
|
||||
return;
|
||||
|
||||
pSrc = ps->map + (y * ps->pitch + x) * cpp;
|
||||
pSrc = (const ubyte *) pipe_surface_map(ps) + (y * ps->pitch + x) * cpp;
|
||||
pDest = (ubyte *) p;
|
||||
|
||||
for (i = 0; i < h; i++) {
|
||||
|
|
@ -73,6 +71,8 @@ pipe_get_tile_raw(struct pipe_context *pipe,
|
|||
pDest += dst_stride;
|
||||
pSrc += src_stride;
|
||||
}
|
||||
|
||||
pipe_surface_unmap(ps);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -92,8 +92,6 @@ pipe_put_tile_raw(struct pipe_context *pipe,
|
|||
ubyte *pDest;
|
||||
uint i;
|
||||
|
||||
assert(ps->map);
|
||||
|
||||
if (src_stride == 0) {
|
||||
src_stride = w * cpp;
|
||||
}
|
||||
|
|
@ -102,13 +100,15 @@ pipe_put_tile_raw(struct pipe_context *pipe,
|
|||
return;
|
||||
|
||||
pSrc = (const ubyte *) p;
|
||||
pDest = ps->map + (y * ps->pitch + x) * cpp;
|
||||
pDest = (ubyte *) pipe_surface_map(ps) + (y * ps->pitch + x) * cpp;
|
||||
|
||||
for (i = 0; i < h; i++) {
|
||||
memcpy(pDest, pSrc, w * cpp);
|
||||
pDest += dst_stride;
|
||||
pSrc += src_stride;
|
||||
}
|
||||
|
||||
pipe_surface_unmap(ps);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -126,11 +126,12 @@ pipe_put_tile_raw(struct pipe_context *pipe,
|
|||
|
||||
static void
|
||||
a8r8g8b8_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const unsigned *src
|
||||
= ((const unsigned *) (ps->map))
|
||||
= ((const unsigned *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
|
@ -158,11 +159,12 @@ a8r8g8b8_get_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
a8r8g8b8_put_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
const float *p)
|
||||
{
|
||||
unsigned *dst
|
||||
= ((unsigned *) (ps->map))
|
||||
= ((unsigned *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
|
@ -193,11 +195,12 @@ a8r8g8b8_put_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
b8g8r8a8_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const unsigned *src
|
||||
= ((const unsigned *) (ps->map))
|
||||
= ((const unsigned *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
|
@ -225,11 +228,12 @@ b8g8r8a8_get_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
b8g8r8a8_put_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
const float *p)
|
||||
{
|
||||
unsigned *dst
|
||||
= ((unsigned *) (ps->map))
|
||||
= ((unsigned *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
|
@ -260,11 +264,12 @@ b8g8r8a8_put_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
a1r5g5b5_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const ushort *src
|
||||
= ((const ushort *) (ps->map))
|
||||
= ((const ushort *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
|
||||
|
|
@ -288,11 +293,12 @@ a1r5g5b5_get_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
a4r4g4b4_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const ushort *src
|
||||
= ((const ushort *) (ps->map))
|
||||
= ((const ushort *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
|
||||
|
|
@ -316,11 +322,12 @@ a4r4g4b4_get_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
r5g6b5_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const ushort *src
|
||||
= ((const ushort *) (ps->map))
|
||||
= ((const ushort *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
|
||||
|
|
@ -342,11 +349,12 @@ r5g6b5_get_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
r5g5b5_put_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
const float *p)
|
||||
{
|
||||
ushort *dst
|
||||
= ((ushort *) (ps->map))
|
||||
= ((ushort *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
|
@ -379,11 +387,12 @@ r5g5b5_put_tile_rgba(struct pipe_surface *ps,
|
|||
*/
|
||||
static void
|
||||
z16_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const ushort *src
|
||||
= ((const ushort *) (ps->map))
|
||||
= ((const ushort *) map)
|
||||
+ y * ps->pitch + x;
|
||||
const float scale = 1.0f / 65535.0f;
|
||||
unsigned i, j;
|
||||
|
|
@ -414,11 +423,12 @@ z16_get_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
l8_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const ubyte *src
|
||||
= ((const ubyte *) (ps->map))
|
||||
= ((const ubyte *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
|
@ -447,11 +457,12 @@ l8_get_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
a8_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const ubyte *src
|
||||
= ((const ubyte *) (ps->map))
|
||||
= ((const ubyte *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
|
@ -480,11 +491,12 @@ a8_get_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
r16g16b16a16_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const short *src
|
||||
= ((const short *) (ps->map))
|
||||
= ((const short *) map)
|
||||
+ (y * ps->pitch + x) * 4;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
|
@ -513,11 +525,12 @@ r16g16b16a16_get_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
r16g16b16a16_put_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
const float *p)
|
||||
{
|
||||
short *dst
|
||||
= ((short *) (ps->map))
|
||||
= ((short *) map)
|
||||
+ (y * ps->pitch + x) * 4;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
|
@ -552,11 +565,12 @@ r16g16b16a16_put_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
i8_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const ubyte *src
|
||||
= ((const ubyte *) (ps->map))
|
||||
= ((const ubyte *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
|
@ -585,11 +599,12 @@ i8_get_tile_rgba(struct pipe_surface *ps,
|
|||
|
||||
static void
|
||||
a8_l8_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const ushort *src
|
||||
= ((const ushort *) (ps->map))
|
||||
= ((const ushort *) map)
|
||||
+ y * ps->pitch + x;
|
||||
unsigned i, j;
|
||||
unsigned w0 = w;
|
||||
|
|
@ -624,11 +639,12 @@ a8_l8_get_tile_rgba(struct pipe_surface *ps,
|
|||
*/
|
||||
static void
|
||||
z32_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const uint *src
|
||||
= ((const uint *) (ps->map))
|
||||
= ((const uint *) map)
|
||||
+ y * ps->pitch + x;
|
||||
const double scale = 1.0 / (double) 0xffffffff;
|
||||
unsigned i, j;
|
||||
|
|
@ -660,11 +676,12 @@ z32_get_tile_rgba(struct pipe_surface *ps,
|
|||
*/
|
||||
static void
|
||||
s8z24_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const uint *src
|
||||
= ((const uint *) (ps->map))
|
||||
= ((const uint *) map)
|
||||
+ y * ps->pitch + x;
|
||||
const double scale = 1.0 / ((1 << 24) - 1);
|
||||
unsigned i, j;
|
||||
|
|
@ -696,11 +713,12 @@ s8z24_get_tile_rgba(struct pipe_surface *ps,
|
|||
*/
|
||||
static void
|
||||
z24s8_get_tile_rgba(struct pipe_surface *ps,
|
||||
void *map,
|
||||
unsigned x, unsigned y, unsigned w, unsigned h,
|
||||
float *p)
|
||||
{
|
||||
const uint *src
|
||||
= ((const uint *) (ps->map))
|
||||
= ((const uint *) map)
|
||||
+ y * ps->pitch + x;
|
||||
const double scale = 1.0 / ((1 << 24) - 1);
|
||||
unsigned i, j;
|
||||
|
|
@ -731,52 +749,56 @@ pipe_get_tile_rgba(struct pipe_context *pipe,
|
|||
uint x, uint y, uint w, uint h,
|
||||
float *p)
|
||||
{
|
||||
void *map = pipe_surface_map(ps);
|
||||
|
||||
switch (ps->format) {
|
||||
case PIPE_FORMAT_A8R8G8B8_UNORM:
|
||||
a8r8g8b8_get_tile_rgba(ps, x, y, w, h, p);
|
||||
a8r8g8b8_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
||||
b8g8r8a8_get_tile_rgba(ps, x, y, w, h, p);
|
||||
b8g8r8a8_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_A1R5G5B5_UNORM:
|
||||
a1r5g5b5_get_tile_rgba(ps, x, y, w, h, p);
|
||||
a1r5g5b5_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_A4R4G4B4_UNORM:
|
||||
a4r4g4b4_get_tile_rgba(ps, x, y, w, h, p);
|
||||
a4r4g4b4_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_R5G6B5_UNORM:
|
||||
r5g6b5_get_tile_rgba(ps, x, y, w, h, p);
|
||||
r5g6b5_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_U_L8:
|
||||
l8_get_tile_rgba(ps, x, y, w, h, p);
|
||||
l8_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_U_A8:
|
||||
a8_get_tile_rgba(ps, x, y, w, h, p);
|
||||
a8_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_U_I8:
|
||||
i8_get_tile_rgba(ps, x, y, w, h, p);
|
||||
i8_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_U_A8_L8:
|
||||
a8_l8_get_tile_rgba(ps, x, y, w, h, p);
|
||||
a8_l8_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_R16G16B16A16_SNORM:
|
||||
r16g16b16a16_get_tile_rgba(ps, x, y, w, h, p);
|
||||
r16g16b16a16_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_Z16_UNORM:
|
||||
z16_get_tile_rgba(ps, x, y, w, h, p);
|
||||
z16_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_Z32_UNORM:
|
||||
z32_get_tile_rgba(ps, x, y, w, h, p);
|
||||
z32_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_S8Z24_UNORM:
|
||||
s8z24_get_tile_rgba(ps, x, y, w, h, p);
|
||||
s8z24_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_Z24S8_UNORM:
|
||||
z24s8_get_tile_rgba(ps, x, y, w, h, p);
|
||||
z24s8_get_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
|
||||
pipe_surface_unmap(ps);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -786,49 +808,53 @@ pipe_put_tile_rgba(struct pipe_context *pipe,
|
|||
uint x, uint y, uint w, uint h,
|
||||
const float *p)
|
||||
{
|
||||
void *map = pipe_surface_map(ps);
|
||||
|
||||
switch (ps->format) {
|
||||
case PIPE_FORMAT_A8R8G8B8_UNORM:
|
||||
a8r8g8b8_put_tile_rgba(ps, x, y, w, h, p);
|
||||
a8r8g8b8_put_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_B8G8R8A8_UNORM:
|
||||
b8g8r8a8_put_tile_rgba(ps, x, y, w, h, p);
|
||||
b8g8r8a8_put_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_A1R5G5B5_UNORM:
|
||||
/*a1r5g5b5_put_tile_rgba(ps, x, y, w, h, p);*/
|
||||
/*a1r5g5b5_put_tile_rgba(ps, map, x, y, w, h, p);*/
|
||||
break;
|
||||
case PIPE_FORMAT_R5G6B5_UNORM:
|
||||
r5g5b5_put_tile_rgba(ps, x, y, w, h, p);
|
||||
r5g5b5_put_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_R8G8B8A8_UNORM:
|
||||
break;
|
||||
case PIPE_FORMAT_U_L8:
|
||||
/*l8_put_tile_rgba(ps, x, y, w, h, p);*/
|
||||
/*l8_put_tile_rgba(ps, map, x, y, w, h, p);*/
|
||||
break;
|
||||
case PIPE_FORMAT_U_A8:
|
||||
/*a8_put_tile_rgba(ps, x, y, w, h, p);*/
|
||||
/*a8_put_tile_rgba(ps, map, x, y, w, h, p);*/
|
||||
break;
|
||||
case PIPE_FORMAT_U_I8:
|
||||
/*i8_put_tile_rgba(ps, x, y, w, h, p);*/
|
||||
/*i8_put_tile_rgba(ps, map, x, y, w, h, p);*/
|
||||
break;
|
||||
case PIPE_FORMAT_U_A8_L8:
|
||||
/*a8_l8_put_tile_rgba(ps, x, y, w, h, p);*/
|
||||
/*a8_l8_put_tile_rgba(ps, map, x, y, w, h, p);*/
|
||||
break;
|
||||
case PIPE_FORMAT_R16G16B16A16_SNORM:
|
||||
r16g16b16a16_put_tile_rgba(ps, x, y, w, h, p);
|
||||
r16g16b16a16_put_tile_rgba(ps, map, x, y, w, h, p);
|
||||
break;
|
||||
case PIPE_FORMAT_Z16_UNORM:
|
||||
/*z16_put_tile_rgba(ps, x, y, w, h, p);*/
|
||||
/*z16_put_tile_rgba(ps, map, x, y, w, h, p);*/
|
||||
break;
|
||||
case PIPE_FORMAT_Z32_UNORM:
|
||||
/*z32_put_tile_rgba(ps, x, y, w, h, p);*/
|
||||
/*z32_put_tile_rgba(ps, map, x, y, w, h, p);*/
|
||||
break;
|
||||
case PIPE_FORMAT_S8Z24_UNORM:
|
||||
/*s8z24_put_tile_rgba(ps, x, y, w, h, p);*/
|
||||
/*s8z24_put_tile_rgba(ps, map, x, y, w, h, p);*/
|
||||
break;
|
||||
case PIPE_FORMAT_Z24S8_UNORM:
|
||||
/*z24s8_put_tile_rgba(ps, x, y, w, h, p);*/
|
||||
/*z24s8_put_tile_rgba(ps, map, x, y, w, h, p);*/
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
|
||||
pipe_surface_unmap(ps);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1247,22 +1247,11 @@ void XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
|
|||
GLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
|
||||
GLint *bytesPerValue, void **buffer )
|
||||
{
|
||||
struct pipe_surface *surf
|
||||
= st_get_framebuffer_surface(b->stfb, ST_SURFACE_DEPTH);
|
||||
if (surf) {
|
||||
*width = surf->width;
|
||||
*height = surf->pitch;
|
||||
*bytesPerValue = surf->cpp;
|
||||
*buffer = surf->map;
|
||||
return GL_TRUE;
|
||||
}
|
||||
else {
|
||||
*width = 0;
|
||||
*height = 0;
|
||||
*bytesPerValue = 0;
|
||||
*buffer = 0;
|
||||
return GL_FALSE;
|
||||
}
|
||||
*width = 0;
|
||||
*height = 0;
|
||||
*bytesPerValue = 0;
|
||||
*buffer = 0;
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@
|
|||
void
|
||||
st_clear_accum_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
|
||||
{
|
||||
struct pipe_context *pipe = ctx->st->pipe;
|
||||
struct st_renderbuffer *acc_strb = st_renderbuffer(rb);
|
||||
struct pipe_surface *acc_ps = acc_strb->surface;
|
||||
const GLint xpos = ctx->DrawBuffer->_Xmin;
|
||||
|
|
@ -69,102 +70,17 @@ st_clear_accum_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
|
|||
const GLfloat g = ctx->Accum.ClearColor[1];
|
||||
const GLfloat b = ctx->Accum.ClearColor[2];
|
||||
const GLfloat a = ctx->Accum.ClearColor[3];
|
||||
GLfloat *accBuf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat));
|
||||
int i;
|
||||
|
||||
(void) pipe_surface_map(acc_ps);
|
||||
|
||||
switch (acc_ps->format) {
|
||||
case PIPE_FORMAT_R16G16B16A16_SNORM:
|
||||
{
|
||||
const short sr = (short) (32767 * r);
|
||||
const short sg = (short) (32767 * g);
|
||||
const short sb = (short) (32767 * b);
|
||||
const short sa = (short) (32767 * a);
|
||||
short *acc = ((short *) acc_ps->map)
|
||||
+ (ypos * acc_ps->pitch + xpos) * 4;
|
||||
int i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++) {
|
||||
acc[j*4+0] = sr;
|
||||
acc[j*4+1] = sg;
|
||||
acc[j*4+2] = sb;
|
||||
acc[j*4+3] = sa;
|
||||
}
|
||||
acc += acc_ps->pitch * 4;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
for (i = 0; i < width * height; i++) {
|
||||
accBuf[i*4+0] = r;
|
||||
accBuf[i*4+1] = g;
|
||||
accBuf[i*4+2] = b;
|
||||
accBuf[i*4+3] = a;
|
||||
}
|
||||
|
||||
pipe_surface_unmap(acc_ps);
|
||||
}
|
||||
|
||||
|
||||
/** Get block of values from accum buffer, converting to float */
|
||||
static void
|
||||
get_accum_tile(struct pipe_context *pipe,
|
||||
struct pipe_surface *acc_surf,
|
||||
int xpos, int ypos, int width, int height,
|
||||
float *buf)
|
||||
{
|
||||
switch (acc_surf->format) {
|
||||
case PIPE_FORMAT_R16G16B16A16_SNORM:
|
||||
{
|
||||
const short *acc = ((const short *) acc_surf->map)
|
||||
+ (ypos * acc_surf->pitch + xpos) * 4;
|
||||
int i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++) {
|
||||
buf[j*4+0] = SHORT_TO_FLOAT(acc[j*4+0]);
|
||||
buf[j*4+1] = SHORT_TO_FLOAT(acc[j*4+1]);
|
||||
buf[j*4+2] = SHORT_TO_FLOAT(acc[j*4+2]);
|
||||
buf[j*4+3] = SHORT_TO_FLOAT(acc[j*4+3]);
|
||||
}
|
||||
acc += acc_surf->pitch * 4;
|
||||
buf += width * 4;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** Put block of values into accum buffer, converting from float */
|
||||
static void
|
||||
put_accum_tile(struct pipe_context *pipe,
|
||||
struct pipe_surface *acc_surf,
|
||||
int xpos, int ypos, int width, int height,
|
||||
const float *buf)
|
||||
{
|
||||
switch (acc_surf->format) {
|
||||
case PIPE_FORMAT_R16G16B16A16_SNORM:
|
||||
{
|
||||
short *acc = ((short *) acc_surf->map)
|
||||
+ (ypos * acc_surf->pitch + xpos) * 4;
|
||||
int i, j;
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++) {
|
||||
short r, g, b, a;
|
||||
UNCLAMPED_FLOAT_TO_SHORT(r, buf[j*4+0]);
|
||||
UNCLAMPED_FLOAT_TO_SHORT(g, buf[j*4+1]);
|
||||
UNCLAMPED_FLOAT_TO_SHORT(b, buf[j*4+2]);
|
||||
UNCLAMPED_FLOAT_TO_SHORT(a, buf[j*4+3]);
|
||||
acc[j*4+0] = r;
|
||||
acc[j*4+1] = g;
|
||||
acc[j*4+2] = b;
|
||||
acc[j*4+3] = a;
|
||||
}
|
||||
acc += acc_surf->pitch * 4;
|
||||
buf += width * 4;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
pipe->put_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -179,19 +95,15 @@ accum_mad(struct pipe_context *pipe, GLfloat scale, GLfloat bias,
|
|||
|
||||
accBuf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat));
|
||||
|
||||
(void) pipe_surface_map(acc_ps);
|
||||
|
||||
get_accum_tile(pipe, acc_ps, xpos, ypos, width, height, accBuf);
|
||||
pipe->get_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf);
|
||||
|
||||
for (i = 0; i < 4 * width * height; i++) {
|
||||
accBuf[i] = accBuf[i] * scale + bias;
|
||||
}
|
||||
|
||||
put_accum_tile(pipe, acc_ps, xpos, ypos, width, height, accBuf);
|
||||
pipe->put_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf);
|
||||
|
||||
free(accBuf);
|
||||
|
||||
pipe_surface_unmap(acc_ps);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -201,30 +113,23 @@ accum_accum(struct pipe_context *pipe, GLfloat value,
|
|||
struct pipe_surface *acc_ps,
|
||||
struct pipe_surface *color_ps)
|
||||
{
|
||||
ubyte *colorMap, *accMap;
|
||||
GLfloat *colorBuf, *accBuf;
|
||||
GLint i;
|
||||
|
||||
colorBuf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat));
|
||||
accBuf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat));
|
||||
|
||||
colorMap = pipe_surface_map(color_ps);
|
||||
accMap = pipe_surface_map(acc_ps);
|
||||
|
||||
pipe->get_tile_rgba(pipe, color_ps, xpos, ypos, width, height, colorBuf);
|
||||
get_accum_tile(pipe, acc_ps, xpos, ypos, width, height, accBuf);
|
||||
pipe->get_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf);
|
||||
|
||||
for (i = 0; i < 4 * width * height; i++) {
|
||||
accBuf[i] = accBuf[i] + colorBuf[i] * value;
|
||||
}
|
||||
|
||||
put_accum_tile(pipe, acc_ps, xpos, ypos, width, height, accBuf);
|
||||
pipe->put_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, accBuf);
|
||||
|
||||
free(colorBuf);
|
||||
free(accBuf);
|
||||
|
||||
pipe_surface_unmap(color_ps);
|
||||
pipe_surface_unmap(acc_ps);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -239,21 +144,15 @@ accum_load(struct pipe_context *pipe, GLfloat value,
|
|||
|
||||
buf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat));
|
||||
|
||||
(void) pipe_surface_map(color_ps);
|
||||
(void) pipe_surface_map(acc_ps);
|
||||
|
||||
pipe->get_tile_rgba(pipe, color_ps, xpos, ypos, width, height, buf);
|
||||
|
||||
for (i = 0; i < 4 * width * height; i++) {
|
||||
buf[i] = buf[i] * value;
|
||||
}
|
||||
|
||||
put_accum_tile(pipe, acc_ps, xpos, ypos, width, height, buf);
|
||||
pipe->put_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, buf);
|
||||
|
||||
free(buf);
|
||||
|
||||
pipe_surface_unmap(color_ps);
|
||||
pipe_surface_unmap(acc_ps);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -270,10 +169,7 @@ accum_return(GLcontext *ctx, GLfloat value,
|
|||
|
||||
abuf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat));
|
||||
|
||||
(void) pipe_surface_map(color_ps);
|
||||
(void) pipe_surface_map(acc_ps);
|
||||
|
||||
get_accum_tile(pipe, acc_ps, xpos, ypos, width, height, abuf);
|
||||
pipe->get_tile_rgba(pipe, acc_ps, xpos, ypos, width, height, abuf);
|
||||
|
||||
if (!colormask[0] || !colormask[1] || !colormask[2] || !colormask[3]) {
|
||||
cbuf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat));
|
||||
|
|
@ -297,9 +193,6 @@ accum_return(GLcontext *ctx, GLfloat value,
|
|||
free(abuf);
|
||||
if (cbuf)
|
||||
free(cbuf);
|
||||
|
||||
pipe_surface_unmap(color_ps);
|
||||
pipe_surface_unmap(acc_ps);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1261,15 +1261,9 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
|
|||
/* alternate path using get/put_tile() */
|
||||
GLfloat *buf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat));
|
||||
|
||||
(void) pipe_surface_map(psRead);
|
||||
(void) pipe_surface_map(psTex);
|
||||
|
||||
pipe->get_tile_rgba(pipe, psRead, srcx, srcy, width, height, buf);
|
||||
pipe->put_tile_rgba(pipe, psTex, 0, 0, width, height, buf);
|
||||
|
||||
pipe_surface_unmap(psRead);
|
||||
pipe_surface_unmap(psTex);
|
||||
|
||||
free(buf);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -97,9 +97,6 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
|
|||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* loop here since mapping is refcounted */
|
||||
while (strb->surface->map)
|
||||
pipe_surface_unmap(strb->surface);
|
||||
if (strb->surface->buffer)
|
||||
pipe->winsys->buffer_reference(pipe->winsys, &strb->surface->buffer,
|
||||
NULL);
|
||||
|
|
|
|||
|
|
@ -179,8 +179,6 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
|
|||
if (!strb)
|
||||
return;
|
||||
|
||||
pipe_surface_map(strb->surface);
|
||||
|
||||
if (format == GL_RGBA && type == GL_FLOAT) {
|
||||
/* write tile(row) directly into user's buffer */
|
||||
df = (GLfloat *) _mesa_image_address2d(&clippedPacking, dest, width,
|
||||
|
|
@ -229,8 +227,6 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
pipe_surface_unmap(strb->surface);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1063,15 +1063,13 @@ fallback_copy_texsubimage(GLcontext *ctx,
|
|||
dest_surf = pipe->get_tex_surface(pipe, pt,
|
||||
face, level, destZ);
|
||||
|
||||
(void) pipe_surface_map(dest_surf);
|
||||
(void) pipe_surface_map(src_surf);
|
||||
|
||||
/* buffer for one row */
|
||||
data = (GLfloat *) malloc(width * 4 * sizeof(GLfloat));
|
||||
|
||||
/* do copy row by row */
|
||||
for (row = 0; row < height; row++) {
|
||||
pipe->get_tile_rgba(pipe, src_surf, srcX, srcY + row, width, 1, data);
|
||||
pipe->get_tile_rgba(pipe, src_surf, srcX, srcY + row, width, 1,
|
||||
data);
|
||||
|
||||
/* XXX we're ignoring convolution for now */
|
||||
if (ctx->_ImageTransferState) {
|
||||
|
|
@ -1080,14 +1078,11 @@ fallback_copy_texsubimage(GLcontext *ctx,
|
|||
width, (GLfloat (*)[4])data);
|
||||
}
|
||||
|
||||
pipe->put_tile_rgba(pipe, dest_surf, destX, destY, width, 1, data);
|
||||
pipe->put_tile_rgba(pipe, dest_surf, destX, destY, width, 1,
|
||||
data);
|
||||
destY += yStep;
|
||||
}
|
||||
|
||||
|
||||
(void) pipe_surface_unmap(dest_surf);
|
||||
(void) pipe_surface_unmap(src_surf);
|
||||
|
||||
free(data);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue