[Mesa-dev] [PATCH 32/84] st/nine: Move pipe and cso to nine_context

Axel Davy axel.davy at ens.fr
Wed Dec 7 22:55:05 UTC 2016


Part of the refactor to move all gallium calls to
nine_state.c, and have all internal states required
for those calls in nine_context.

Signed-off-by: Axel Davy <axel.davy at ens.fr>
---
 src/gallium/state_trackers/nine/device9.c    |  32 +++----
 src/gallium/state_trackers/nine/device9.h    |   2 -
 src/gallium/state_trackers/nine/nine_ff.c    |   8 +-
 src/gallium/state_trackers/nine/nine_pipe.c  |   2 +-
 src/gallium/state_trackers/nine/nine_state.c | 129 ++++++++++++++++-----------
 src/gallium/state_trackers/nine/nine_state.h |   3 +
 6 files changed, 101 insertions(+), 75 deletions(-)

diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c
index 89c15bc..4acccee 100644
--- a/src/gallium/state_trackers/nine/device9.c
+++ b/src/gallium/state_trackers/nine/device9.c
@@ -191,18 +191,18 @@ NineDevice9_ctor( struct NineDevice9 *This,
     if (This->may_swvp)
         This->caps.MaxVertexShaderConst = NINE_MAX_CONST_F_SWVP;
 
-    This->pipe = This->screen->context_create(This->screen, NULL, 0);
-    if (!This->pipe) { return E_OUTOFMEMORY; } /* guess */
+    This->context.pipe = This->screen->context_create(This->screen, NULL, 0);
+    if (!This->context.pipe) { return E_OUTOFMEMORY; } /* guess */
     This->pipe_sw = This->screen_sw->context_create(This->screen_sw, NULL, 0);
     if (!This->pipe_sw) { return E_OUTOFMEMORY; }
 
-    This->cso = cso_create_context(This->pipe);
-    if (!This->cso) { return E_OUTOFMEMORY; } /* also a guess */
+    This->context.cso = cso_create_context(This->context.pipe);
+    if (!This->context.cso) { return E_OUTOFMEMORY; } /* also a guess */
     This->cso_sw = cso_create_context(This->pipe_sw);
     if (!This->cso_sw) { return E_OUTOFMEMORY; }
 
     /* Create first, it messes up our state. */
-    This->hud = hud_create(This->pipe, This->cso); /* NULL result is fine */
+    This->hud = hud_create(This->context.pipe, This->context.cso); /* NULL result is fine */
 
     /* Available memory counter. Updated only for allocations with this device
      * instance. This is the Win 7 behavior.
@@ -289,14 +289,14 @@ NineDevice9_ctor( struct NineDevice9 *This,
             return D3DERR_OUTOFVIDEOMEMORY;
 
         u_box_1d(0, 16, &box);
-        data = This->pipe->transfer_map(This->pipe, This->dummy_vbo, 0,
+        data = This->context.pipe->transfer_map(This->context.pipe, This->dummy_vbo, 0,
                                         PIPE_TRANSFER_WRITE |
                                         PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE,
                                         &box, &transfer);
         assert(data);
         assert(transfer);
         memset(data, 0, 16);
-        This->pipe->transfer_unmap(This->pipe, transfer);
+        This->context.pipe->transfer_unmap(This->context.pipe, transfer);
     }
 
     This->cursor.software = FALSE;
@@ -423,7 +423,7 @@ NineDevice9_ctor( struct NineDevice9 *This,
         templ.swizzle_a = PIPE_SWIZZLE_1;
         templ.target = This->dummy_texture->target;
 
-        This->dummy_sampler_view = This->pipe->create_sampler_view(This->pipe, This->dummy_texture, &templ);
+        This->dummy_sampler_view = This->context.pipe->create_sampler_view(This->context.pipe, This->dummy_texture, &templ);
         if (!This->dummy_sampler_view)
             return D3DERR_DRIVERINTERNALERROR;
 
@@ -450,16 +450,16 @@ NineDevice9_ctor( struct NineDevice9 *This,
     This->driver_caps.user_sw_cbufs = This->screen_sw->get_param(This->screen_sw, PIPE_CAP_USER_CONSTANT_BUFFERS);
 
     if (!This->driver_caps.user_vbufs)
-        This->vertex_uploader = u_upload_create(This->pipe, 65536,
+        This->vertex_uploader = u_upload_create(This->context.pipe, 65536,
                                                 PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_STREAM);
     This->vertex_sw_uploader = u_upload_create(This->pipe_sw, 65536,
                                             PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_STREAM);
     if (!This->driver_caps.user_ibufs)
-        This->index_uploader = u_upload_create(This->pipe, 128 * 1024,
+        This->index_uploader = u_upload_create(This->context.pipe, 128 * 1024,
                                                PIPE_BIND_INDEX_BUFFER, PIPE_USAGE_STREAM);
     if (!This->driver_caps.user_cbufs) {
         This->constbuf_alignment = GET_PCAP(CONSTANT_BUFFER_OFFSET_ALIGNMENT);
-        This->constbuf_uploader = u_upload_create(This->pipe, This->vs_const_size,
+        This->constbuf_uploader = u_upload_create(This->context.pipe, This->vs_const_size,
                                                   PIPE_BIND_CONSTANT_BUFFER, PIPE_USAGE_STREAM);
     }
 
@@ -478,7 +478,7 @@ NineDevice9_ctor( struct NineDevice9 *This,
     {
         struct pipe_poly_stipple stipple;
         memset(&stipple, ~0, sizeof(stipple));
-        This->pipe->set_polygon_stipple(This->pipe, &stipple);
+        This->context.pipe->set_polygon_stipple(This->context.pipe, &stipple);
     }
 
     This->update = &This->state;
@@ -498,7 +498,7 @@ NineDevice9_dtor( struct NineDevice9 *This )
 
     DBG("This=%p\n", This);
 
-    if (This->pipe && This->cso)
+    if (This->context.pipe && This->context.cso)
         nine_pipe_context_clear(This);
     nine_ff_fini(This);
     nine_state_destroy_sw(This);
@@ -545,9 +545,9 @@ NineDevice9_dtor( struct NineDevice9 *This )
     }
 
     /* Destroy cso first */
-    if (This->cso) { cso_destroy_context(This->cso); }
+    if (This->context.cso) { cso_destroy_context(This->context.cso); }
     if (This->cso_sw) { cso_destroy_context(This->cso_sw); }
-    if (This->pipe && This->pipe->destroy) { This->pipe->destroy(This->pipe); }
+    if (This->context.pipe && This->context.pipe->destroy) { This->context.pipe->destroy(This->context.pipe); }
     if (This->pipe_sw && This->pipe_sw->destroy) { This->pipe_sw->destroy(This->pipe_sw); }
 
     if (This->present) { ID3DPresentGroup_Release(This->present); }
@@ -565,7 +565,7 @@ NineDevice9_GetScreen( struct NineDevice9 *This )
 struct pipe_context *
 NineDevice9_GetPipe( struct NineDevice9 *This )
 {
-    return This->pipe;
+    return This->context.pipe;
 }
 
 const D3DCAPS9 *
diff --git a/src/gallium/state_trackers/nine/device9.h b/src/gallium/state_trackers/nine/device9.h
index a1f3e45..21e045c 100644
--- a/src/gallium/state_trackers/nine/device9.h
+++ b/src/gallium/state_trackers/nine/device9.h
@@ -53,9 +53,7 @@ struct NineDevice9
     /* G3D context */
     struct pipe_screen *screen;
     struct pipe_screen *screen_sw;
-    struct pipe_context *pipe;
     struct pipe_context *pipe_sw;
-    struct cso_context *cso;
     struct cso_context *cso_sw;
 
     /* creation parameters */
diff --git a/src/gallium/state_trackers/nine/nine_ff.c b/src/gallium/state_trackers/nine/nine_ff.c
index e168bf8..b18b00e 100644
--- a/src/gallium/state_trackers/nine/nine_ff.c
+++ b/src/gallium/state_trackers/nine/nine_ff.c
@@ -1057,7 +1057,7 @@ nine_ff_build_vs(struct NineDevice9 *device, struct vs_build_ctx *vs)
 
     ureg_END(ureg);
     nine_ureg_tgsi_dump(ureg, FALSE);
-    return ureg_create_shader_and_destroy(ureg, device->pipe);
+    return ureg_create_shader_and_destroy(ureg, device->context.pipe);
 }
 
 /* PS FF constants layout:
@@ -1552,7 +1552,7 @@ nine_ff_build_ps(struct NineDevice9 *device, struct nine_ff_ps_key *key)
 
     ureg_END(ureg);
     nine_ureg_tgsi_dump(ureg, FALSE);
-    return ureg_create_shader_and_destroy(ureg, device->pipe);
+    return ureg_create_shader_and_destroy(ureg, device->context.pipe);
 }
 
 static struct NineVertexShader9 *
@@ -2159,7 +2159,7 @@ nine_ff_prune_vs(struct NineDevice9 *device)
 
     if (device->ff.num_vs > 100) {
         /* could destroy the bound one here, so unbind */
-        device->pipe->bind_vs_state(device->pipe, NULL);
+        context->pipe->bind_vs_state(context->pipe, NULL);
         util_hash_table_foreach(device->ff.ht_vs, nine_ff_ht_delete_cb, NULL);
         util_hash_table_clear(device->ff.ht_vs);
         device->ff.num_vs = 0;
@@ -2173,7 +2173,7 @@ nine_ff_prune_ps(struct NineDevice9 *device)
 
     if (device->ff.num_ps > 100) {
         /* could destroy the bound one here, so unbind */
-        device->pipe->bind_fs_state(device->pipe, NULL);
+        context->pipe->bind_fs_state(context->pipe, NULL);
         util_hash_table_foreach(device->ff.ht_ps, nine_ff_ht_delete_cb, NULL);
         util_hash_table_clear(device->ff.ht_ps);
         device->ff.num_ps = 0;
diff --git a/src/gallium/state_trackers/nine/nine_pipe.c b/src/gallium/state_trackers/nine/nine_pipe.c
index 46ac801..2970b27 100644
--- a/src/gallium/state_trackers/nine/nine_pipe.c
+++ b/src/gallium/state_trackers/nine/nine_pipe.c
@@ -253,7 +253,7 @@ void
 nine_pipe_context_clear(struct NineDevice9 *This)
 {
     struct pipe_context *pipe = NineDevice9_GetPipe(This);
-    struct cso_context *cso = This->cso;
+    struct cso_context *cso = This->context.cso;
     pipe->bind_vs_state(pipe, NULL);
     pipe->bind_fs_state(pipe, NULL);
 
diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c
index d294fd8..b5afc9b 100644
--- a/src/gallium/state_trackers/nine/nine_state.c
+++ b/src/gallium/state_trackers/nine/nine_state.c
@@ -413,8 +413,8 @@ prepare_ps(struct NineDevice9 *device, uint8_t shader_changed)
 static void
 update_framebuffer(struct NineDevice9 *device, bool is_clear)
 {
-    struct pipe_context *pipe = device->pipe;
     struct nine_context *context = &device->context;
+    struct pipe_context *pipe = context->pipe;
     struct pipe_framebuffer_state *fb = &context->pipe_data.fb;
     unsigned i;
     struct NineSurface9 *rt0 = context->rt[0];
@@ -489,7 +489,8 @@ update_framebuffer(struct NineDevice9 *device, bool is_clear)
 static void
 update_viewport(struct NineDevice9 *device)
 {
-    const D3DVIEWPORT9 *vport = &device->context.viewport;
+    struct nine_context *context = &device->context;
+    const D3DVIEWPORT9 *vport = &context->viewport;
     struct pipe_viewport_state pvport;
 
     /* D3D coordinates are:
@@ -527,7 +528,7 @@ update_viewport(struct NineDevice9 *device)
         pvport.translate[1] -= 1.0f / 128.0f;
     }
 
-    cso_set_viewport(device->cso, &pvport);
+    cso_set_viewport(context->cso, &pvport);
 }
 
 /* Loop through VS inputs and pick the vertex elements with the declared
@@ -617,14 +618,14 @@ update_vertex_elements(struct NineDevice9 *device)
         context->dummy_vbo_bound_at = dummy_vbo_stream;
     }
 
-    cso_set_vertex_elements(device->cso, vs->num_inputs, ve);
+    cso_set_vertex_elements(context->cso, vs->num_inputs, ve);
 }
 
 static void
 update_vertex_buffers(struct NineDevice9 *device)
 {
-    struct pipe_context *pipe = device->pipe;
     struct nine_context *context = &device->context;
+    struct pipe_context *pipe = context->pipe;
     struct pipe_vertex_buffer dummy_vtxbuf;
     uint32_t mask = context->changed.vtxbuf;
     unsigned i;
@@ -722,7 +723,7 @@ update_textures_and_samplers(struct NineDevice9 *device)
             if (update_sampler_derived(context, s) || (context->changed.sampler[s] & 0x05fe)) {
                 context->changed.sampler[s] = 0;
                 commit_samplers = TRUE;
-                nine_convert_sampler_state(device->cso, s, context->samp[s]);
+                nine_convert_sampler_state(context->cso, s, context->samp[s]);
             }
         } else {
             /* Bind dummy sampler. We do not bind dummy sampler when
@@ -734,7 +735,7 @@ update_textures_and_samplers(struct NineDevice9 *device)
             view[i] = device->dummy_sampler_view;
             num_textures = i + 1;
 
-            cso_single_sampler(device->cso, PIPE_SHADER_FRAGMENT,
+            cso_single_sampler(context->cso, PIPE_SHADER_FRAGMENT,
                                s - NINE_SAMPLER_PS(0), &device->dummy_sampler_state);
 
             commit_samplers = TRUE;
@@ -744,10 +745,10 @@ update_textures_and_samplers(struct NineDevice9 *device)
         context->bound_samplers_mask_ps |= (1 << s);
     }
 
-    cso_set_sampler_views(device->cso, PIPE_SHADER_FRAGMENT, num_textures, view);
+    cso_set_sampler_views(context->cso, PIPE_SHADER_FRAGMENT, num_textures, view);
 
     if (commit_samplers)
-        cso_single_sampler_done(device->cso, PIPE_SHADER_FRAGMENT);
+        cso_single_sampler_done(context->cso, PIPE_SHADER_FRAGMENT);
 
     commit_samplers = FALSE;
     sampler_mask = context->programmable_vs ? context->vs->sampler_mask : 0;
@@ -770,7 +771,7 @@ update_textures_and_samplers(struct NineDevice9 *device)
             if (update_sampler_derived(context, s) || (context->changed.sampler[s] & 0x05fe)) {
                 context->changed.sampler[s] = 0;
                 commit_samplers = TRUE;
-                nine_convert_sampler_state(device->cso, s, context->samp[s]);
+                nine_convert_sampler_state(context->cso, s, context->samp[s]);
             }
         } else {
             /* Bind dummy sampler. We do not bind dummy sampler when
@@ -782,7 +783,7 @@ update_textures_and_samplers(struct NineDevice9 *device)
             view[i] = device->dummy_sampler_view;
             num_textures = i + 1;
 
-            cso_single_sampler(device->cso, PIPE_SHADER_VERTEX,
+            cso_single_sampler(context->cso, PIPE_SHADER_VERTEX,
                                s - NINE_SAMPLER_VS(0), &device->dummy_sampler_state);
 
             commit_samplers = TRUE;
@@ -792,10 +793,10 @@ update_textures_and_samplers(struct NineDevice9 *device)
         context->bound_samplers_mask_vs |= (1 << s);
     }
 
-    cso_set_sampler_views(device->cso, PIPE_SHADER_VERTEX, num_textures, view);
+    cso_set_sampler_views(context->cso, PIPE_SHADER_VERTEX, num_textures, view);
 
     if (commit_samplers)
-        cso_single_sampler_done(device->cso, PIPE_SHADER_VERTEX);
+        cso_single_sampler_done(context->cso, PIPE_SHADER_VERTEX);
 }
 
 /* State commit only */
@@ -803,35 +804,43 @@ update_textures_and_samplers(struct NineDevice9 *device)
 static inline void
 commit_blend(struct NineDevice9 *device)
 {
-    cso_set_blend(device->cso, &device->context.pipe_data.blend);
+    struct nine_context *context = &device->context;
+
+    cso_set_blend(context->cso, &context->pipe_data.blend);
 }
 
 static inline void
 commit_dsa(struct NineDevice9 *device)
 {
-    cso_set_depth_stencil_alpha(device->cso, &device->context.pipe_data.dsa);
+    struct nine_context *context = &device->context;
+
+    cso_set_depth_stencil_alpha(context->cso, &context->pipe_data.dsa);
 }
 
 static inline void
 commit_scissor(struct NineDevice9 *device)
 {
-    struct pipe_context *pipe = device->pipe;
+    struct nine_context *context = &device->context;
+    struct pipe_context *pipe = context->pipe;
 
-    pipe->set_scissor_states(pipe, 0, 1, &device->context.scissor);
+    pipe->set_scissor_states(pipe, 0, 1, &context->scissor);
 }
 
 static inline void
 commit_rasterizer(struct NineDevice9 *device)
 {
-    cso_set_rasterizer(device->cso, &device->context.pipe_data.rast);
+    struct nine_context *context = &device->context;
+
+    cso_set_rasterizer(context->cso, &context->pipe_data.rast);
 }
 
 static inline void
 commit_index_buffer(struct NineDevice9 *device)
 {
-    struct pipe_context *pipe = device->pipe;
-    if (device->context.idxbuf.buffer)
-        pipe->set_index_buffer(pipe, &device->context.idxbuf);
+    struct nine_context *context = &device->context;
+    struct pipe_context *pipe = context->pipe;
+    if (context->idxbuf.buffer)
+        pipe->set_index_buffer(pipe, &context->idxbuf);
     else
         pipe->set_index_buffer(pipe, NULL);
 }
@@ -839,18 +848,19 @@ commit_index_buffer(struct NineDevice9 *device)
 static inline void
 commit_vs_constants(struct NineDevice9 *device)
 {
-    struct pipe_context *pipe = device->pipe;
+    struct nine_context *context = &device->context;
+    struct pipe_context *pipe = context->pipe;
 
-    if (unlikely(!device->context.programmable_vs))
-        pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &device->context.pipe_data.cb_vs_ff);
+    if (unlikely(!context->programmable_vs))
+        pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &context->pipe_data.cb_vs_ff);
     else {
         if (device->swvp) {
-            pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &device->context.pipe_data.cb0_swvp);
-            pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 1, &device->context.pipe_data.cb1_swvp);
-            pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 2, &device->context.pipe_data.cb2_swvp);
-            pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 3, &device->context.pipe_data.cb3_swvp);
+            pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &context->pipe_data.cb0_swvp);
+            pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 1, &context->pipe_data.cb1_swvp);
+            pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 2, &context->pipe_data.cb2_swvp);
+            pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 3, &context->pipe_data.cb3_swvp);
         } else {
-            pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &device->context.pipe_data.cb_vs);
+            pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, &context->pipe_data.cb_vs);
         }
     }
 }
@@ -858,12 +868,13 @@ commit_vs_constants(struct NineDevice9 *device)
 static inline void
 commit_ps_constants(struct NineDevice9 *device)
 {
-    struct pipe_context *pipe = device->pipe;
+    struct nine_context *context = &device->context;
+    struct pipe_context *pipe = context->pipe;
 
-    if (unlikely(!device->context.ps))
-        pipe->set_constant_buffer(pipe, PIPE_SHADER_FRAGMENT, 0, &device->context.pipe_data.cb_ps_ff);
+    if (unlikely(!context->ps))
+        pipe->set_constant_buffer(pipe, PIPE_SHADER_FRAGMENT, 0, &context->pipe_data.cb_ps_ff);
     else
-        pipe->set_constant_buffer(pipe, PIPE_SHADER_FRAGMENT, 0, &device->context.pipe_data.cb_ps);
+        pipe->set_constant_buffer(pipe, PIPE_SHADER_FRAGMENT, 0, &context->pipe_data.cb_ps);
 }
 
 static inline void
@@ -871,7 +882,7 @@ commit_vs(struct NineDevice9 *device)
 {
     struct nine_context *context = &device->context;
 
-    device->pipe->bind_vs_state(device->pipe, context->cso_shader.vs);
+    context->pipe->bind_vs_state(context->pipe, context->cso_shader.vs);
 }
 
 
@@ -880,7 +891,7 @@ commit_ps(struct NineDevice9 *device)
 {
     struct nine_context *context = &device->context;
 
-    device->pipe->bind_fs_state(device->pipe, context->cso_shader.ps);
+    context->pipe->bind_fs_state(context->pipe, context->cso_shader.ps);
 }
 /* State Update */
 
@@ -945,8 +956,8 @@ update_managed_buffers(struct NineDevice9 *device)
 static void
 nine_update_state(struct NineDevice9 *device)
 {
-    struct pipe_context *pipe = device->pipe;
     struct nine_context *context = &device->context;
+    struct pipe_context *pipe = context->pipe;
     uint32_t group;
 
     DBG("changed state groups: %x\n", context->changed.group);
@@ -1108,7 +1119,7 @@ NineDevice9_ResolveZ( struct NineDevice9 *device )
     blit.filter = PIPE_TEX_FILTER_NEAREST;
     blit.scissor_enable = FALSE;
 
-    device->pipe->blit(device->pipe, &blit);
+    context->pipe->blit(context->pipe, &blit);
 }
 
 #define ALPHA_TO_COVERAGE_ENABLE   MAKEFOURCC('A', '2', 'M', '1')
@@ -1850,7 +1861,7 @@ nine_context_clear_fb(struct NineDevice9 *device,
     struct nine_context *context = &device->context;
     const int sRGB = context->rs[D3DRS_SRGBWRITEENABLE] ? 1 : 0;
     struct pipe_surface *cbuf, *zsbuf;
-    struct pipe_context *pipe = device->pipe;
+    struct pipe_context *pipe = context->pipe;
     struct NineSurface9 *zsbuf_surf = context->ds;
     struct NineSurface9 *rt;
     unsigned bufs = 0;
@@ -2006,6 +2017,7 @@ nine_context_draw_primitive(struct NineDevice9 *device,
                             UINT StartVertex,
                             UINT PrimitiveCount)
 {
+    struct nine_context *context = &device->context;
     struct pipe_draw_info info;
 
     nine_update_state(device);
@@ -2017,7 +2029,7 @@ nine_context_draw_primitive(struct NineDevice9 *device,
     info.min_index = info.start;
     info.max_index = info.count - 1;
 
-    device->pipe->draw_vbo(device->pipe, &info);
+    context->pipe->draw_vbo(context->pipe, &info);
 }
 
 void
@@ -2029,6 +2041,7 @@ nine_context_draw_indexed_primitive(struct NineDevice9 *device,
                                     UINT StartIndex,
                                     UINT PrimitiveCount)
 {
+    struct nine_context *context = &device->context;
     struct pipe_draw_info info;
 
     nine_update_state(device);
@@ -2041,7 +2054,7 @@ nine_context_draw_indexed_primitive(struct NineDevice9 *device,
     info.min_index = MinVertexIndex;
     info.max_index = MinVertexIndex + NumVertices - 1;
 
-    device->pipe->draw_vbo(device->pipe, &info);
+    context->pipe->draw_vbo(context->pipe, &info);
 }
 
 void
@@ -2050,6 +2063,7 @@ nine_context_draw_primitive_from_vtxbuf(struct NineDevice9 *device,
                                         UINT PrimitiveCount,
                                         struct pipe_vertex_buffer *vtxbuf)
 {
+    struct nine_context *context = &device->context;
     struct pipe_draw_info info;
 
     nine_update_state(device);
@@ -2061,9 +2075,9 @@ nine_context_draw_primitive_from_vtxbuf(struct NineDevice9 *device,
     info.min_index = 0;
     info.max_index = info.count - 1;
 
-    device->pipe->set_vertex_buffers(device->pipe, 0, 1, vtxbuf);
+    context->pipe->set_vertex_buffers(context->pipe, 0, 1, vtxbuf);
 
-    device->pipe->draw_vbo(device->pipe, &info);
+    context->pipe->draw_vbo(context->pipe, &info);
 
     pipe_resource_reference(&vtxbuf->buffer, NULL);
 }
@@ -2077,6 +2091,7 @@ nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf(struct NineDevice9 *devic
                                                        struct pipe_vertex_buffer *vbuf,
                                                        struct pipe_index_buffer *ibuf)
 {
+    struct nine_context *context = &device->context;
     struct pipe_draw_info info;
 
     nine_update_state(device);
@@ -2087,10 +2102,10 @@ nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf(struct NineDevice9 *devic
     info.index_bias = 0;
     info.min_index = MinVertexIndex;
     info.max_index = MinVertexIndex + NumVertices - 1;
-    device->pipe->set_vertex_buffers(device->pipe, 0, 1, vbuf);
-    device->pipe->set_index_buffer(device->pipe, ibuf);
+    context->pipe->set_vertex_buffers(context->pipe, 0, 1, vbuf);
+    context->pipe->set_index_buffer(context->pipe, ibuf);
 
-    device->pipe->draw_vbo(device->pipe, &info);
+    context->pipe->draw_vbo(context->pipe, &info);
 
     pipe_resource_reference(&vbuf->buffer, NULL);
     pipe_resource_reference(&ibuf->buffer, NULL);
@@ -2099,25 +2114,33 @@ nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf(struct NineDevice9 *devic
 struct pipe_query *
 nine_context_create_query(struct NineDevice9 *device, unsigned query_type)
 {
-    return device->pipe->create_query(device->pipe, query_type, 0);
+    struct nine_context *context = &device->context;
+
+    return context->pipe->create_query(context->pipe, query_type, 0);
 }
 
 void
 nine_context_destroy_query(struct NineDevice9 *device, struct pipe_query *query)
 {
-    device->pipe->destroy_query(device->pipe, query);
+    struct nine_context *context = &device->context;
+
+    context->pipe->destroy_query(context->pipe, query);
 }
 
 void
 nine_context_begin_query(struct NineDevice9 *device, struct pipe_query *query)
 {
-    (void) device->pipe->begin_query(device->pipe, query);
+    struct nine_context *context = &device->context;
+
+    (void) context->pipe->begin_query(context->pipe, query);
 }
 
 void
 nine_context_end_query(struct NineDevice9 *device, struct pipe_query *query)
 {
-    (void) device->pipe->end_query(device->pipe, query);
+    struct nine_context *context = &device->context;
+
+    (void) context->pipe->end_query(context->pipe, query);
 }
 
 boolean
@@ -2125,8 +2148,10 @@ nine_context_get_query_result(struct NineDevice9 *device, struct pipe_query *que
                               boolean flush, boolean wait,
                               union pipe_query_result *result)
 {
+    struct nine_context *context = &device->context;
+
     (void) flush;
-    return device->pipe->get_query_result(device->pipe, query, wait, result);
+    return context->pipe->get_query_result(context->pipe, query, wait, result);
 }
 
 /* State defaults */
@@ -2523,7 +2548,7 @@ update_vertex_elements_sw(struct NineDevice9 *device)
 static void
 update_vertex_buffers_sw(struct NineDevice9 *device, int start_vertice, int num_vertices)
 {
-    struct pipe_context *pipe = device->pipe;
+    struct pipe_context *pipe = NineDevice9_GetPipe(device);
     struct pipe_context *pipe_sw = device->pipe_sw;
     struct nine_state *state = &device->state;
     struct nine_state_sw_internal *sw_internal = &device->state_sw_internal;
@@ -2748,7 +2773,7 @@ void
 nine_state_after_draw_sw(struct NineDevice9 *device)
 {
     struct nine_state_sw_internal *sw_internal = &device->state_sw_internal;
-    struct pipe_context *pipe = device->pipe;
+    struct pipe_context *pipe = NineDevice9_GetPipe(device);
     struct pipe_context *pipe_sw = device->pipe_sw;
     int i;
 
diff --git a/src/gallium/state_trackers/nine/nine_state.h b/src/gallium/state_trackers/nine/nine_state.h
index 921074d..0919025 100644
--- a/src/gallium/state_trackers/nine/nine_state.h
+++ b/src/gallium/state_trackers/nine/nine_state.h
@@ -241,6 +241,9 @@ struct nine_context {
         void *ps;
     } cso_shader;
 
+    struct pipe_context *pipe;
+    struct cso_context *cso;
+
     uint8_t rt_mask;
 
     D3DVIEWPORT9 viewport;
-- 
2.10.2



More information about the mesa-dev mailing list