N_03-nv30-locking-fixes.patch 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. From: Ilia Mirkin <imirkin@alum.mit.edu>
  2. Date: Tue Jun 21 22:59:50 2016 -0400
  3. Subject: [PATCH 3/5]nv30 locking fixes
  4. Patch-mainline: N/A
  5. References: boo#997171
  6. Signed-off-by: Max Staudt <mstaudt@suse.de>
  7. Cherry-picked from 940b3a773f264f3f52574160f0d06c48f8e8aeb2
  8. at https://github.com/imirkin/mesa.git
  9. Signed-off-by: Max Staudt <mstaudt@suse.de>
  10. ---
  11. src/gallium/drivers/nouveau/nv30/nv30_draw.c | 20 ++++++++++++++++++--
  12. src/gallium/drivers/nouveau/nv30/nv30_fragprog.c | 4 ++++
  13. 2 files changed, 22 insertions(+), 2 deletions(-)
  14. diff --git a/src/gallium/drivers/nouveau/nv30/nv30_draw.c b/src/gallium/drivers/nouveau/nv30/nv30_draw.c
  15. index 7b0d074..1c71534 100644
  16. --- a/src/gallium/drivers/nouveau/nv30/nv30_draw.c
  17. +++ b/src/gallium/drivers/nouveau/nv30/nv30_draw.c
  18. @@ -127,6 +127,8 @@ nv30_render_draw_elements(struct vbuf_render *render,
  19. struct nouveau_pushbuf *push = nv30->screen->base.pushbuf;
  20. unsigned i;
  21. + pipe_mutex_lock(nv30->screen->base.push_mutex);
  22. +
  23. BEGIN_NV04(push, NV30_3D(VTXBUF(0)), r->vertex_info.num_attribs);
  24. for (i = 0; i < r->vertex_info.num_attribs; i++) {
  25. PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP,
  26. @@ -134,8 +136,10 @@ nv30_render_draw_elements(struct vbuf_render *render,
  27. NOUVEAU_BO_LOW | NOUVEAU_BO_RD, 0, NV30_3D_VTXBUF_DMA1);
  28. }
  29. - if (!nv30_state_validate(nv30, ~0, false))
  30. + if (!nv30_state_validate(nv30, ~0, false)) {
  31. + pipe_mutex_unlock(nv30->screen->base.push_mutex);
  32. return;
  33. + }
  34. BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
  35. PUSH_DATA (push, r->prim);
  36. @@ -160,6 +164,8 @@ nv30_render_draw_elements(struct vbuf_render *render,
  37. BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
  38. PUSH_DATA (push, NV30_3D_VERTEX_BEGIN_END_STOP);
  39. PUSH_RESET(push, BUFCTX_VTXTMP);
  40. +
  41. + pipe_mutex_unlock(nv30->screen->base.push_mutex);
  42. }
  43. static void
  44. @@ -172,6 +178,8 @@ nv30_render_draw_arrays(struct vbuf_render *render, unsigned start, uint nr)
  45. unsigned ps = fn + (pn ? 1 : 0);
  46. unsigned i;
  47. + pipe_mutex_lock(nv30->screen->base.push_mutex);
  48. +
  49. BEGIN_NV04(push, NV30_3D(VTXBUF(0)), r->vertex_info.num_attribs);
  50. for (i = 0; i < r->vertex_info.num_attribs; i++) {
  51. PUSH_RESRC(push, NV30_3D(VTXBUF(i)), BUFCTX_VTXTMP,
  52. @@ -179,8 +187,10 @@ nv30_render_draw_arrays(struct vbuf_render *render, unsigned start, uint nr)
  53. NOUVEAU_BO_LOW | NOUVEAU_BO_RD, 0, NV30_3D_VTXBUF_DMA1);
  54. }
  55. - if (!nv30_state_validate(nv30, ~0, false))
  56. + if (!nv30_state_validate(nv30, ~0, false)) {
  57. + pipe_mutex_unlock(nv30->screen->base.push_mutex);
  58. return;
  59. + }
  60. BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
  61. PUSH_DATA (push, r->prim);
  62. @@ -197,6 +207,8 @@ nv30_render_draw_arrays(struct vbuf_render *render, unsigned start, uint nr)
  63. BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
  64. PUSH_DATA (push, NV30_3D_VERTEX_BEGIN_END_STOP);
  65. PUSH_RESET(push, BUFCTX_VTXTMP);
  66. +
  67. + pipe_mutex_unlock(nv30->screen->base.push_mutex);
  68. }
  69. static void
  70. @@ -383,6 +395,8 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
  71. nv30_render_validate(nv30);
  72. + pipe_mutex_unlock(nv30->screen->base.push_mutex);
  73. +
  74. if (nv30->draw_dirty & NV30_NEW_VIEWPORT)
  75. draw_set_viewport_states(draw, 0, 1, &nv30->viewport);
  76. if (nv30->draw_dirty & NV30_NEW_RASTERIZER)
  77. @@ -448,6 +462,8 @@ nv30_render_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
  78. if (transfer[i])
  79. pipe_buffer_unmap(pipe, transfer[i]);
  80. + pipe_mutex_lock(nv30->screen->base.push_mutex);
  81. +
  82. nv30->draw_dirty = 0;
  83. nv30_state_release(nv30);
  84. }
  85. diff --git a/src/gallium/drivers/nouveau/nv30/nv30_fragprog.c b/src/gallium/drivers/nouveau/nv30/nv30_fragprog.c
  86. index 6de61bc..fd21f99 100644
  87. --- a/src/gallium/drivers/nouveau/nv30/nv30_fragprog.c
  88. +++ b/src/gallium/drivers/nouveau/nv30/nv30_fragprog.c
  89. @@ -38,6 +38,8 @@ nv30_fragprog_upload(struct nv30_context *nv30)
  90. struct nv30_fragprog *fp = nv30->fragprog.program;
  91. struct pipe_context *pipe = &nv30->base.pipe;
  92. + pipe_mutex_unlock(nv->screen->push_mutex);
  93. +
  94. if (unlikely(!fp->buffer))
  95. fp->buffer = pipe_buffer_create(pipe->screen, 0, 0, fp->insn_len * 4);
  96. @@ -60,6 +62,8 @@ nv30_fragprog_upload(struct nv30_context *nv30)
  97. if (nv04_resource(fp->buffer)->domain != NOUVEAU_BO_VRAM)
  98. nouveau_buffer_migrate(nv, nv04_resource(fp->buffer), NOUVEAU_BO_VRAM);
  99. +
  100. + pipe_mutex_lock(nv->screen->push_mutex);
  101. }
  102. void