From 3eadb1b3a1be98cd2f1d4787a4921d2e39f9901f Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 9 Jan 2018 23:13:16 -0800 Subject: [PATCH] iris: framebuffers --- src/gallium/drivers/iris/iris_context.h | 2 + src/gallium/drivers/iris/iris_state.c | 63 +++++++++++++++---------- 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/gallium/drivers/iris/iris_context.h b/src/gallium/drivers/iris/iris_context.h index eed17bf2ee0..5a6ee906ab7 100644 --- a/src/gallium/drivers/iris/iris_context.h +++ b/src/gallium/drivers/iris/iris_context.h @@ -49,6 +49,7 @@ enum iris_dirty { IRIS_DIRTY_SCISSOR = (1ull << 10), IRIS_DIRTY_LINE_STIPPLE = (1ull << 11), IRIS_DIRTY_VERTEX_ELEMENTS = (1ull << 12), + IRIS_DIRTY_MULTISAMPLE = (1ull << 13), }; struct iris_depth_stencil_alpha_state; @@ -71,6 +72,7 @@ struct iris_context { struct pipe_poly_stipple poly_stipple; struct pipe_scissor_state scissors[IRIS_MAX_VIEWPORTS]; struct pipe_stencil_ref stencil_ref; + struct pipe_framebuffer_state framebuffer; } state; }; diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 00da80b4326..66f33fc242b 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -413,6 +413,7 @@ struct iris_rasterizer_state { bool flatshade; /* for shader state */ bool light_twoside; /* for shader state */ bool rasterizer_discard; /* for 3DSTATE_STREAMOUT */ + bool half_pixel_center; /* for 3DSTATE_MULTISAMPLE */ enum pipe_sprite_coord_mode sprite_coord_mode; /* PIPE_SPRITE_* */ uint8_t line_stipple_factor; @@ -450,7 +451,7 @@ iris_create_rasterizer_state(struct pipe_context *ctx, cso->line_stipple_factor = state->line_stipple_factor; cso->line_stipple_pattern = state->line_stipple_pattern; // for 3DSTATE_MULTISAMPLE, if we want it. - //cso->half_pixel_center = state->half_pixel_center; + cso->half_pixel_center = state->half_pixel_center; iris_pack_command(GENX(3DSTATE_SF), cso->sf, sf) { sf.StatisticsEnable = true; @@ -545,6 +546,10 @@ iris_bind_rasterizer_state(struct pipe_context *ctx, void *state) ice->state.dirty |= IRIS_DIRTY_LINE_STIPPLE; } + if (old_cso->half_pixel_center != new_cso->half_pixel_center) { + ice->state.dirty |= IRIS_DIRTY_MULTISAMPLE; + } + ice->state.cso_rast = new_cso; ice->state.dirty |= IRIS_DIRTY_RASTER; } @@ -985,34 +990,32 @@ iris_set_viewport_states(struct pipe_context *ctx, ice->state.dirty |= IRIS_DIRTY_SF_CL_VIEWPORT; } -struct iris_framebuffer_state { - struct pipe_framebuffer_state pipe; -}; - static void iris_set_framebuffer_state(struct pipe_context *ctx, const struct pipe_framebuffer_state *state) { -#if 0 struct iris_context *ice = (struct iris_context *) ctx; - struct iris_framebuffer_state *cso = - malloc(sizeof(struct iris_framebuffer_state)); + struct pipe_framebuffer_state *cso = &ice->state.framebuffer; - unsigned i; - for (i = 0; i < framebuffer->nr_cbufs; i++) - pipe_surface_reference(&cso->pipe.cbufs[i], framebuffer->cbufs[i]); - for (; i < vc5->framebuffer.nr_cbufs; i++) - pipe_surface_reference(&cso->pipe.cbufs[i], NULL); + if (cso->samples != state->samples) { + ice->state.dirty |= IRIS_DIRTY_MULTISAMPLE; + } - cso->pipe.nr_cbufs = state->nr_cbufs; + cso->width = state->width; + cso->height = state->height; + cso->layers = state->layers; + cso->samples = state->samples; - pipe_surface_reference(&cso->pipe.zsbuf, framebuffer->zsbuf); + unsigned i; + for (i = 0; i < state->nr_cbufs; i++) + pipe_surface_reference(&cso->cbufs[i], state->cbufs[i]); + for (; i < cso->nr_cbufs; i++) + pipe_surface_reference(&cso->cbufs[i], NULL); - // ice->state.cso_fb = cso; - // ice->state.dirty |= IRIS_DIRTY_FRAMEBUFFER; + cso->nr_cbufs = state->nr_cbufs; + + pipe_surface_reference(&cso->zsbuf, state->zsbuf); - // XXX: unreference them when destroying context -#endif } static void @@ -1286,6 +1289,18 @@ iris_upload_render_state(struct iris_context *ice, struct iris_batch *batch) iris_batch_emit(batch, cso->vf_instancing[i], sizeof(cso->vf_instancing[0])); } + for (int i = 0; i < cso->count; i++) { + /* TODO: vertexid, instanceid support */ + iris_emit_cmd(batch, GENX(3DSTATE_VF_SGVS), sgvs); + } + } + + if (dirty & IRIS_DIRTY_MULTISAMPLE) { + iris_emit_cmd(batch, GENX(3DSTATE_MULTISAMPLE), ms) { + ms.PixelLocation = + ice->state.cso_rast->half_pixel_center ? CENTER : UL_CORNER; + ms.NumberofMultisamples = ffs(ice->state.framebuffer.samples) - 1; + } } #if 0 @@ -1351,12 +1366,6 @@ iris_upload_render_state(struct iris_context *ice, struct iris_batch *batch) -> pipe_draw_info (index) 3DSTATE_VERTEX_BUFFERS -> pipe_vertex_buffer (set_vertex_buffer hook) - 3DSTATE_VERTEX_ELEMENTS - -> iris_vertex_element - 3DSTATE_VF_INSTANCING - -> iris_vertex_element - 3DSTATE_VF_SGVS - -> TODO ??? 3DSTATE_VF_COMPONENT_PACKING -> TODO ??? @@ -1374,6 +1383,10 @@ void iris_destroy_state(struct iris_context *ice) { // XXX: unreference resources/surfaces. + for (unsigned i = 0; i < ice->state.framebuffer.nr_cbufs; i++) { + pipe_surface_reference(&ice->state.framebuffer.cbufs[i], NULL); + } + pipe_surface_reference(&ice->state.framebuffer.zsbuf, NULL); } void -- 2.30.2