X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fllvmpipe%2Flp_scene.c;h=59eed4145504942a08f6250f37cb72dd2af5ebb3;hb=0dac24790e7386a51f1d513762ef08ca20ed994d;hp=66dd1d23257bc1b7d49e392dbdcd854583e9911d;hpb=be188289e1bf0e259c91a751c405d54bb99bc5d4;p=mesa.git diff --git a/src/gallium/drivers/llvmpipe/lp_scene.c b/src/gallium/drivers/llvmpipe/lp_scene.c index 66dd1d23257..59eed414550 100644 --- a/src/gallium/drivers/llvmpipe/lp_scene.c +++ b/src/gallium/drivers/llvmpipe/lp_scene.c @@ -30,7 +30,7 @@ #include "util/u_memory.h" #include "util/u_inlines.h" #include "util/simple_list.h" -#include "util/u_format.h" +#include "util/format/u_format.h" #include "lp_scene.h" #include "lp_fence.h" #include "lp_debug.h" @@ -106,8 +106,8 @@ lp_scene_is_empty(struct lp_scene *scene ) { unsigned x, y; - for (y = 0; y < TILES_Y; y++) { - for (x = 0; x < TILES_X; x++) { + for (y = 0; y < scene->tiles_y; y++) { + for (x = 0; x < scene->tiles_x; x++) { const struct cmd_bin *bin = lp_scene_get_bin(scene, x, y); if (bin->head) { return FALSE; @@ -160,6 +160,8 @@ lp_scene_begin_rasterization(struct lp_scene *scene) if (!cbuf) { scene->cbufs[i].stride = 0; scene->cbufs[i].layer_stride = 0; + scene->cbufs[i].sample_stride = 0; + scene->cbufs[i].nr_samples = 0; scene->cbufs[i].map = NULL; continue; } @@ -169,18 +171,22 @@ lp_scene_begin_rasterization(struct lp_scene *scene) cbuf->u.tex.level); scene->cbufs[i].layer_stride = llvmpipe_layer_stride(cbuf->texture, cbuf->u.tex.level); + scene->cbufs[i].sample_stride = llvmpipe_sample_stride(cbuf->texture); scene->cbufs[i].map = llvmpipe_resource_map(cbuf->texture, cbuf->u.tex.level, cbuf->u.tex.first_layer, LP_TEX_USAGE_READ_WRITE); scene->cbufs[i].format_bytes = util_format_get_blocksize(cbuf->format); + scene->cbufs[i].nr_samples = util_res_sample_count(cbuf->texture); } else { struct llvmpipe_resource *lpr = llvmpipe_resource(cbuf->texture); unsigned pixstride = util_format_get_blocksize(cbuf->format); scene->cbufs[i].stride = cbuf->texture->width0; scene->cbufs[i].layer_stride = 0; + scene->cbufs[i].sample_stride = 0; + scene->cbufs[i].nr_samples = 1; scene->cbufs[i].map = lpr->data; scene->cbufs[i].map += cbuf->u.buf.first_element * pixstride; scene->cbufs[i].format_bytes = util_format_get_blocksize(cbuf->format); @@ -191,7 +197,8 @@ lp_scene_begin_rasterization(struct lp_scene *scene) struct pipe_surface *zsbuf = scene->fb.zsbuf; scene->zsbuf.stride = llvmpipe_resource_stride(zsbuf->texture, zsbuf->u.tex.level); scene->zsbuf.layer_stride = llvmpipe_layer_stride(zsbuf->texture, zsbuf->u.tex.level); - + scene->zsbuf.sample_stride = llvmpipe_sample_stride(zsbuf->texture); + scene->zsbuf.nr_samples = util_res_sample_count(zsbuf->texture); scene->zsbuf.map = llvmpipe_resource_map(zsbuf->texture, zsbuf->u.tex.level, zsbuf->u.tex.first_layer, @@ -484,7 +491,7 @@ lp_scene_bin_iter_next( struct lp_scene *scene , int *x, int *y) { struct cmd_bin *bin = NULL; - pipe_mutex_lock(scene->mutex); + mtx_lock(&scene->mutex); if (scene->curr_x < 0) { /* first bin */ @@ -502,20 +509,19 @@ lp_scene_bin_iter_next( struct lp_scene *scene , int *x, int *y) end: /*printf("return bin %p at %d, %d\n", (void *) bin, *bin_x, *bin_y);*/ - pipe_mutex_unlock(scene->mutex); + mtx_unlock(&scene->mutex); return bin; } -void lp_scene_begin_binning( struct lp_scene *scene, - struct pipe_framebuffer_state *fb, boolean discard ) +void lp_scene_begin_binning(struct lp_scene *scene, + struct pipe_framebuffer_state *fb) { int i; unsigned max_layer = ~0; assert(lp_scene_is_empty(scene)); - scene->discard = discard; util_copy_framebuffer_state(&scene->fb, fb); scene->tiles_x = align(fb->width, TILE_SIZE) / TILE_SIZE; @@ -546,6 +552,13 @@ void lp_scene_begin_binning( struct lp_scene *scene, max_layer = MIN2(max_layer, zsbuf->u.tex.last_layer - zsbuf->u.tex.first_layer); } scene->fb_max_layer = max_layer; + scene->fb_max_samples = util_framebuffer_get_num_samples(fb); + if (scene->fb_max_samples == 4) { + for (unsigned i = 0; i < 4; i++) { + scene->fixed_sample_pos[i][0] = util_iround(lp_sample_pos_4x[i][0] * FIXED_ONE); + scene->fixed_sample_pos[i][1] = util_iround(lp_sample_pos_4x[i][1] * FIXED_ONE); + } + } }