Browse Source

svga: adapt to interface changes

might need further cleanup. Using surfaces internally just to be able to use
the existing code might cause unnecessary copies afaict.
undefined
Roland Scheidegger 15 years ago
parent
commit
eb2b668b37
2 changed files with 42 additions and 19 deletions
  1. 35
    16
      src/gallium/drivers/svga/svga_pipe_blit.c
  2. 7
    3
      src/gallium/drivers/svga/svga_screen.c

+ 35
- 16
src/gallium/drivers/svga/svga_pipe_blit.c View File

@@ -28,33 +28,47 @@
#include "svga_debug.h"
#include "svga_cmd.h"
#include "svga_surface.h"
#include "util/u_surface.h"

#define FILE_DEBUG_FLAG DEBUG_BLIT


/* XXX I got my doubts about this, should maybe use svga_texture_copy_handle directly? */
static void svga_surface_copy(struct pipe_context *pipe,
struct pipe_surface *dest,
unsigned destx, unsigned desty,
struct pipe_surface *src,
unsigned srcx, unsigned srcy,
struct pipe_resource* dst_tex,
struct pipe_subresource subdst,
unsigned dstx, unsigned dsty, unsigned dstz,
struct pipe_resource* src_tex,
struct pipe_subresource subsrc,
unsigned srcx, unsigned srcy, unsigned srcz,
unsigned width, unsigned height)
{
struct svga_context *svga = svga_context(pipe);
struct pipe_screen *screen = pipe->screen;
SVGA3dCopyBox *box;
enum pipe_error ret;
struct pipe_surface *srcsurf, *dstsurf;

svga_hwtnl_flush_retry( svga );

srcsurf = screen->get_tex_surface(screen, src_tex,
subsrc.face, subsrc.level, srcz,
PIPE_BIND_SAMPLER_VIEW);

dstsurf = screen->get_tex_surface(screen, dst_tex,
subdst.face, subdst.level, dstz,
PIPE_BIND_RENDER_TARGET);

SVGA_DBG(DEBUG_DMA, "blit to sid %p (%d,%d), from sid %p (%d,%d) sz %dx%d\n",
svga_surface(dest)->handle,
destx, desty,
svga_surface(src)->handle,
svga_surface(dstsurf)->handle,
dstx, dsty,
svga_surface(srcsurf)->handle,
srcx, srcy,
width, height);

ret = SVGA3D_BeginSurfaceCopy(svga->swc,
src,
dest,
srcsurf,
dstsurf,
&box,
1);
if(ret != PIPE_OK) {
@@ -62,15 +76,15 @@ static void svga_surface_copy(struct pipe_context *pipe,
svga_context_flush(svga, NULL);

ret = SVGA3D_BeginSurfaceCopy(svga->swc,
src,
dest,
srcsurf,
dstsurf,
&box,
1);
assert(ret == PIPE_OK);
}

box->x = destx;
box->y = desty;
box->x = dstx;
box->y = dsty;
box->z = 0;
box->w = width;
box->h = height;
@@ -81,13 +95,18 @@ static void svga_surface_copy(struct pipe_context *pipe,

SVGA_FIFOCommitAll(svga->swc);

svga_surface(dest)->dirty = TRUE;
svga_propagate_surface(pipe, dest);
svga_surface(dstsurf)->dirty = TRUE;
svga_propagate_surface(pipe, dstsurf);

pipe_surface_reference(&srcsurf, NULL);
pipe_surface_reference(&dstsurf, NULL);

}


void
svga_init_blit_functions(struct svga_context *svga)
{
svga->pipe.surface_copy = svga_surface_copy;
svga->pipe.resource_copy_region = svga_surface_copy;
svga->pipe.resource_fill_region = util_resource_fill_region;
}

+ 7
- 3
src/gallium/drivers/svga/svga_screen.c View File

@@ -237,17 +237,21 @@ svga_translate_format_cap(enum pipe_format format)

static boolean
svga_is_format_supported( struct pipe_screen *screen,
enum pipe_format format,
enum pipe_format format,
enum pipe_texture_target target,
unsigned tex_usage,
unsigned sample_count,
unsigned tex_usage,
unsigned geom_flags )
{
struct svga_winsys_screen *sws = svga_screen(screen)->sws;
SVGA3dDevCapIndex index;
SVGA3dDevCapResult result;
assert(tex_usage);

if (sample_count > 1)
return FALSE;

/* Override host capabilities */
if (tex_usage & PIPE_BIND_RENDER_TARGET) {
switch(format) {

Loading…
Cancel
Save