softpipe: rework to use the llvmpipe winsys

Promote the llvmpipe winsys more or less unchanged to
state_trackers/sw_winsys.h.

Some minor breakages:
  - softpipe::texture_blanket is broken, but scheduled for removal anyway.
  - haven't fixed up g3vdl yet.
This commit is contained in:
Keith Whitwell
2010-03-04 16:09:33 +00:00
parent c7f7a309af
commit 94ce4eb3c2
28 changed files with 768 additions and 1680 deletions

View File

@@ -40,7 +40,8 @@
#include "sp_context.h"
#include "sp_texture.h"
#include "sp_screen.h"
#include "sp_winsys.h"
#include "state_tracker/sw_winsys.h"
/**
@@ -72,11 +73,9 @@ softpipe_texture_layout(struct pipe_screen *screen,
depth = u_minify(depth, 1);
}
spt->buffer = screen->buffer_create(screen, 32,
PIPE_BUFFER_USAGE_PIXEL,
buffer_size);
spt->data = align_malloc(buffer_size, 16);
return spt->buffer != NULL;
return spt->data != NULL;
}
@@ -87,19 +86,18 @@ static boolean
softpipe_displaytarget_layout(struct pipe_screen *screen,
struct softpipe_texture * spt)
{
unsigned usage = (PIPE_BUFFER_USAGE_CPU_READ_WRITE |
PIPE_BUFFER_USAGE_GPU_READ_WRITE);
unsigned tex_usage = spt->base.tex_usage;
struct sw_winsys *winsys = softpipe_screen(screen)->winsys;
spt->buffer = screen->surface_buffer_create( screen,
spt->base.width0,
spt->base.height0,
spt->base.format,
usage,
tex_usage,
&spt->stride[0]);
/* Round up the surface size to a multiple of the tile size?
*/
spt->dt = winsys->displaytarget_create(winsys,
spt->base.format,
spt->base.width0,
spt->base.height0,
16,
&spt->stride[0] );
return spt->buffer != NULL;
return spt->dt != NULL;
}
@@ -149,37 +147,29 @@ softpipe_texture_blanket(struct pipe_screen * screen,
const unsigned *stride,
struct pipe_buffer *buffer)
{
struct softpipe_texture *spt;
assert(screen);
/* Only supports one type */
if (base->target != PIPE_TEXTURE_2D ||
base->last_level != 0 ||
base->depth0 != 1) {
return NULL;
}
spt = CALLOC_STRUCT(softpipe_texture);
if (!spt)
return NULL;
spt->base = *base;
pipe_reference_init(&spt->base.reference, 1);
spt->base.screen = screen;
spt->stride[0] = stride[0];
pipe_buffer_reference(&spt->buffer, buffer);
return &spt->base;
/* Texture blanket is going away.
*/
debug_printf("softpipe_texture_blanket() not implemented!");
return NULL;
}
static void
softpipe_texture_destroy(struct pipe_texture *pt)
{
struct softpipe_screen *screen = softpipe_screen(pt->screen);
struct softpipe_texture *spt = softpipe_texture(pt);
pipe_buffer_reference(&spt->buffer, NULL);
if (spt->dt) {
/* display target */
struct sw_winsys *winsys = screen->winsys;
winsys->displaytarget_destroy(winsys, spt->dt);
}
else {
/* regular texture */
align_free(spt->data);
}
FREE(spt);
}
@@ -359,9 +349,20 @@ softpipe_transfer_map( struct pipe_screen *screen,
spt = softpipe_texture(transfer->texture);
format = transfer->texture->format;
map = pipe_buffer_map(screen, spt->buffer, pipe_transfer_buffer_flags(transfer));
if (map == NULL)
return NULL;
if (spt->dt) {
/* display target */
struct sw_winsys *winsys = softpipe_screen(screen)->winsys;
map = winsys->displaytarget_map(winsys, spt->dt,
pipe_transfer_buffer_flags(transfer));
if (map == NULL)
return NULL;
}
else {
map = spt->data;
if (map == NULL)
return NULL;
}
/* May want to different things here depending on read/write nature
* of the map:
@@ -393,7 +394,11 @@ softpipe_transfer_unmap(struct pipe_screen *screen,
assert(transfer->texture);
spt = softpipe_texture(transfer->texture);
pipe_buffer_unmap( screen, spt->buffer );
if (spt->dt) {
/* display target */
struct sw_winsys *winsys = softpipe_screen(screen)->winsys;
winsys->displaytarget_unmap(winsys, spt->dt);
}
if (transfer->usage & PIPE_TRANSFER_WRITE) {
/* Mark the texture as dirty to expire the tile caches. */
@@ -474,24 +479,4 @@ softpipe_init_screen_texture_funcs(struct pipe_screen *screen)
}
/**
* Return pipe_buffer handle and stride for given texture object.
* XXX used for???
*/
boolean
softpipe_get_texture_buffer( struct pipe_texture *texture,
struct pipe_buffer **buf,
unsigned *stride )
{
struct softpipe_texture *tex = (struct softpipe_texture *) texture;
if (!tex)
return FALSE;
pipe_buffer_reference(buf, tex->buffer);
if (stride)
*stride = tex->stride[0];
return TRUE;
}