nine: set_vertex_buffers'a devredilen referansi al

Mesa'nin "eliminate frontend refcounting" refactor'u (MR 36296)
set_vertex_buffers'in sahiplik sozlesmesini degistirdi: cagiranin
referansi artik devralinyor. threaded_context'te tc_set_vertex_buffers()
slot'a duz memcpy yapiyor (referans almiyor) ve
tc_call_set_vertex_buffers() surucuye verdikten sonra da birakmiyor --
komut asenkron calistigi icin tamponun hayatta kalmasi tamamen o
devredilen referansa bagli.

Nine eski sozlesmeye gore yazilmisti: odunc isaretci veriyor, referansi
kendinde tutuyordu (eskiden take_ownership=false parametresi vardi).
Refactor'un samplerview parcasi Nine'a uygulanmisti (Mart 2025), ama
vertex/constant buffer parcasi Nine silindikten sonra geldi, dolayisiyla
Nine hic uyarlanmadi.

Sonuc: CSMT kuyrugu komutu calistirmadan once Nine kendi referansini
birakirsa kaynak oluyor; tc replay edince crocus_set_vertex_buffers olu
kaynaga referans almaya calisiyor ve u_inlines.h'de
"pipe_reference_described: count != 1" ile patliyor. Zamanlamaya bagli,
dolayisiyla araliklidir.

Gercek cokme (The Witcher EE, 8086:0166, bes denemenin ikisinde):
  pipe_reference_described
  crocus_set_vertex_buffers
  tc_call_set_vertex_elements_and_buffers

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
elwrclandClaude Opus 5 committed 2026-09-21 22:57:41 +03:00
1 parent e013642d5c
commit a4188446da
1 file changed
+33 -2
+33 -2
View File
@@ -970,6 +970,35 @@ update_vertex_elements(struct NineDevice9 *device)
cso_set_vertex_elements(context->cso, &ve);
}
/* Mesa 26.x (MR 36296, "eliminate frontend refcounting"): set_vertex_buffers
* artik cagiranin referansini DEVRALIYOR. threaded_context'te
* tc_set_vertex_buffers() slot'a duz memcpy yapiyor (referans almiyor) ve
* tc_call_set_vertex_buffers() surucuye verdikten sonra da birakmiyor --
* komut asenkron calistigi icin tamponun hayatta kalmasi tamamen o devredilen
* referansa bagli.
*
* Nine eski sozlesmeye gore yazilmisti: odunc isaretci veriyor, referansi
* kendinde tutuyordu (eskiden set_vertex_buffers'in take_ownership=false
* parametresi vardi). Nine 25.2'de silindigi icin bu MR'a hic uyarlanmadi.
* Sonuc: CSMT kuyrugu komutu calistirmadan once Nine kendi referansini
* birakirsa kaynak olur; tc replay edince crocus_set_vertex_buffers olu
* kaynaga referans almaya calisir ve u_inlines.h:83'te
* "pipe_reference_described: count != 1" ile patlar. Zamanlamaya bagli
* oldugu icin araliklidir.
*
* GERCEK COKME (Witcher EE, 8086:0166):
* pipe_reference_described <- crocus_set_vertex_buffers
* <- tc_call_set_vertex_elements_and_buffers
*/
static void
nine_ref_vertex_buffers(struct pipe_vertex_buffer *vb, unsigned count)
{
for (unsigned i = 0; i < count; i++) {
if (!vb[i].is_user_buffer && vb[i].buffer.resource)
pipe_reference(NULL, &vb[i].buffer.resource->reference);
}
}
static void
update_vertex_buffers(struct NineDevice9 *device)
{
@@ -1000,9 +1029,10 @@ update_vertex_buffers(struct NineDevice9 *device)
if (i < num_vertex_buffers)
memset(&vbuffer[i], 0, sizeof(vbuffer[i]) * (num_vertex_buffers - i));
if (num_vertex_buffers)
if (num_vertex_buffers) {
nine_ref_vertex_buffers(vbuffer, num_vertex_buffers);
pipe->set_vertex_buffers(pipe, num_vertex_buffers, vbuffer);
else
} else
pipe->set_vertex_buffers(pipe, 0, NULL);
context->changed.vtxbuf_dirty = false;
@@ -2567,6 +2597,7 @@ CSMT_ITEM_NO_WAIT(nine_context_draw_indexed_primitive_from_vtxbuf_idxbuf,
else
info.index.user = user_ibuf;
nine_ref_vertex_buffers(vbuf, 1);
context->pipe->set_vertex_buffers(context->pipe, 1, vbuf);
context->changed.vtxbuf_dirty = true;