X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fwinsys%2Fsw%2Fwrapper%2Fwrapper_sw_winsys.c;h=3a76098b655b223c6c586cffb3ab56f258d82e22;hb=222d2f2ac2c7d93cbc0643082c78278ad2c8cfce;hp=459b1c1e2a3829f9a917d747f5a7ca0b952674dc;hpb=dff50ff592da7cb1d784fae794dd1647a5445bca;p=mesa.git diff --git a/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c b/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c index 459b1c1e2a3..3a76098b655 100644 --- a/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c +++ b/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c @@ -52,12 +52,13 @@ struct wrapper_sw_winsys struct sw_winsys base; struct pipe_screen *screen; struct pipe_context *pipe; + enum pipe_texture_target target; }; struct wrapper_sw_displaytarget { struct wrapper_sw_winsys *winsys; - struct pipe_texture *tex; + struct pipe_resource *tex; struct pipe_transfer *transfer; unsigned width; @@ -89,26 +90,26 @@ static boolean wsw_dt_get_stride(struct wrapper_sw_displaytarget *wdt, unsigned *stride) { struct pipe_context *pipe = wdt->winsys->pipe; - struct pipe_texture *tex = wdt->tex; + struct pipe_resource *tex = wdt->tex; struct pipe_transfer *tr; - tr = pipe->get_tex_transfer(pipe, tex, 0, 0, 0, - PIPE_TRANSFER_READ_WRITE, - 0, 0, wdt->width, wdt->height); + tr = pipe_get_transfer(pipe, tex, 0, 0, 0, + PIPE_TRANSFER_READ_WRITE, + 0, 0, wdt->width, wdt->height); if (!tr) return FALSE; *stride = tr->stride; wdt->stride = tr->stride; - pipe->tex_transfer_destroy(pipe, tr); + pipe->transfer_destroy(pipe, tr); return TRUE; } static struct sw_displaytarget * wsw_dt_wrap_texture(struct wrapper_sw_winsys *wsw, - struct pipe_texture *tex, unsigned *stride) + struct pipe_resource *tex, unsigned *stride) { struct wrapper_sw_displaytarget *wdt = CALLOC_STRUCT(wrapper_sw_displaytarget); if (!wdt) @@ -125,34 +126,35 @@ wsw_dt_wrap_texture(struct wrapper_sw_winsys *wsw, err_free: FREE(wdt); err_unref: - pipe_texture_reference(&tex, NULL); + pipe_resource_reference(&tex, NULL); return NULL; } static struct sw_displaytarget * wsw_dt_create(struct sw_winsys *ws, - unsigned tex_usage, + unsigned bind, enum pipe_format format, unsigned width, unsigned height, unsigned alignment, unsigned *stride) { struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); - struct pipe_texture templ; - struct pipe_texture *tex; + struct pipe_resource templ; + struct pipe_resource *tex; /* * XXX Why don't we just get the template. */ memset(&templ, 0, sizeof(templ)); + templ.target = wsw->target; templ.width0 = width; templ.height0 = height; templ.format = format; - templ.tex_usage = tex_usage; + templ.bind = bind; /* XXX alignment: we can't do anything about this */ - tex = wsw->screen->texture_create(wsw->screen, &templ); + tex = wsw->screen->resource_create(wsw->screen, &templ); if (!tex) return NULL; @@ -161,20 +163,32 @@ wsw_dt_create(struct sw_winsys *ws, static struct sw_displaytarget * wsw_dt_from_handle(struct sw_winsys *ws, - const struct pipe_texture *templ, + const struct pipe_resource *templ, struct winsys_handle *whandle, unsigned *stride) { struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); - struct pipe_texture *tex; + struct pipe_resource *tex; - tex = wsw->screen->texture_from_handle(wsw->screen, templ, whandle); + tex = wsw->screen->resource_from_handle(wsw->screen, templ, whandle); if (!tex) return NULL; return wsw_dt_wrap_texture(wsw, tex, stride); } +static boolean +wsw_dt_get_handle(struct sw_winsys *ws, + struct sw_displaytarget *dt, + struct winsys_handle *whandle) +{ + struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws); + struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); + struct pipe_resource *tex = wdt->tex; + + return wsw->screen->resource_get_handle(wsw->screen, tex, whandle); +} + static void * wsw_dt_map(struct sw_winsys *ws, struct sw_displaytarget *dt, @@ -182,7 +196,7 @@ wsw_dt_map(struct sw_winsys *ws, { struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); struct pipe_context *pipe = wdt->winsys->pipe; - struct pipe_texture *tex = wdt->tex; + struct pipe_resource *tex = wdt->tex; struct pipe_transfer *tr; void *ptr; @@ -190,9 +204,9 @@ wsw_dt_map(struct sw_winsys *ws, assert(!wdt->transfer); - tr = pipe->get_tex_transfer(pipe, tex, 0, 0, 0, - PIPE_TRANSFER_READ_WRITE, - 0, 0, wdt->width, wdt->height); + tr = pipe_get_transfer(pipe, tex, 0, 0, 0, + PIPE_TRANSFER_READ_WRITE, + 0, 0, wdt->width, wdt->height); if (!tr) return NULL; @@ -212,7 +226,7 @@ wsw_dt_map(struct sw_winsys *ws, return wdt->ptr; err: - pipe->tex_transfer_destroy(pipe, tr); + pipe->transfer_destroy(pipe, tr); return NULL; } @@ -231,7 +245,7 @@ wsw_dt_unmap(struct sw_winsys *ws, return; pipe->transfer_unmap(pipe, wdt->transfer); - pipe->tex_transfer_destroy(pipe, wdt->transfer); + pipe->transfer_destroy(pipe, wdt->transfer); wdt->transfer = NULL; } @@ -241,7 +255,7 @@ wsw_dt_destroy(struct sw_winsys *ws, { struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt); - pipe_texture_reference(&wdt->tex, NULL); + pipe_resource_reference(&wdt->tex, NULL); FREE(wdt); } @@ -262,8 +276,12 @@ wrapper_sw_winsys_warp_pipe_screen(struct pipe_screen *screen) { struct wrapper_sw_winsys *wsw = CALLOC_STRUCT(wrapper_sw_winsys); + if (!wsw) + goto err; + wsw->base.displaytarget_create = wsw_dt_create; wsw->base.displaytarget_from_handle = wsw_dt_from_handle; + wsw->base.displaytarget_get_handle = wsw_dt_get_handle; wsw->base.displaytarget_map = wsw_dt_map; wsw->base.displaytarget_unmap = wsw_dt_unmap; wsw->base.displaytarget_destroy = wsw_dt_destroy; @@ -272,11 +290,17 @@ wrapper_sw_winsys_warp_pipe_screen(struct pipe_screen *screen) wsw->screen = screen; wsw->pipe = screen->context_create(screen, NULL); if (!wsw->pipe) - goto err; + goto err_free; + + if(screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) + wsw->target = PIPE_TEXTURE_2D; + else + wsw->target = PIPE_TEXTURE_RECT; return &wsw->base; -err: +err_free: FREE(wsw); +err: return NULL; }