diff --git a/chip/pm4_me.pas b/chip/pm4_me.pas index 7756ab5f..9841f2a9 100644 --- a/chip/pm4_me.pas +++ b/chip/pm4_me.pas @@ -302,7 +302,11 @@ end; procedure t_pm4_me.trigger; begin - gc_wakeup_internal_ptr(@queue); + if (gc_kqueue<>nil) then + begin + gc_wakeup_internal_ptr(@queue); + end; + { if (event<>nil) then begin @@ -325,7 +329,11 @@ begin t.tv_nsec:=1000000000 div 1000; r:=0; - kern_kevent2(gc_kqueue,nil,0,@kev,Length(kev),@t,@r); + + if (gc_kqueue<>nil) then + begin + kern_kevent2(gc_kqueue,nil,0,@kev,Length(kev),@t,@r); + end; wmin_addr:=nil; @@ -1323,7 +1331,7 @@ begin iv:=ri.FetchView(ctx.Cmd,FView,iu_sampled); Assert(iv<>nil); - Writeln('BindImage:->'#13#10, + Writeln('BindImage:->[',i,']'#13#10, ' 0x',HexStr(ri.FHandle,16),':',ri.key.cformat,':',ri.FName,'->'#13#10, ' 0x',HexStr(iv.FHandle,16),':',iv.key.cformat,':',iv.FName); @@ -1340,7 +1348,7 @@ begin iv:=ri.FetchView(ctx.Cmd,FView,iu_storage); Assert(iv<>nil); - Writeln('BindStorage:->'#13#10, + Writeln('BindStorage:->[',i,']'#13#10, ' 0x',HexStr(ri.FHandle,16),':',ri.key.cformat,':',ri.FName,'->'#13#10, ' 0x',HexStr(iv.FHandle,16),':',iv.key.cformat,':',iv.FName); @@ -1903,7 +1911,7 @@ begin ctx.Render.AddClearColor(ctx.rt_info^.RT_INFO[i].CLEAR_COLOR); - Writeln('BindFrame:->'#13#10, + Writeln('BindFrame:->[',i,']'#13#10, ' 0x',HexStr(ri.FHandle,16),':',ri.key.cformat,':',ri.FName,'->'#13#10, ' 0x',HexStr(iv.FHandle,16),':',iv.key.cformat,':',iv.FName); @@ -2061,7 +2069,7 @@ begin Prepare_Uniforms(ctx,BP_GRAPHICS,FUniformBuilder); //////// - //DumpShaderGroup(ctx.rt_info^.ShaderGroup); + DumpShaderGroup(ctx.rt_info^.ShaderGroup); if not ctx.Cmd.BeginRenderPass(@ctx.Render,GP) then begin diff --git a/sys/dev/dev_gc.pas b/sys/dev/dev_gc.pas index 2eb0613b..006da647 100644 --- a/sys/dev/dev_gc.pas +++ b/sys/dev/dev_gc.pas @@ -229,27 +229,9 @@ begin pctx^.stream[stGfxDcb].SubmitFlipEop(Body^.DATA,Body^.intSel); end; -procedure _FlushAndWaitMe(pctx:p_pfp_ctx); -var - event:PRTLEvent; -begin - if (pctx^.event=nil) then - begin - pctx^.event:=RTLEventCreate; - end; - - event:=pctx^.event; - - pctx^.stream[stGfxDcb].PfpSyncMe(event); - - pctx^.Flush_stream(stGfxDcb); - - RTLEventWaitFor(event); -end; - procedure onSwitchBuffer(pctx:p_pfp_ctx;Body:Pointer); begin - _FlushAndWaitMe(pctx); + // end; function pm4_parse_gfx_ring(pctx:p_pfp_ctx;token:DWORD;buff:Pointer):Integer; @@ -700,8 +682,6 @@ begin //-> gc_imdone_tasklet - pm4_me_gfx.trigger; //update if wait - gc_imdone_tasklet; pm4_me_gfx.imdone; @@ -1430,16 +1410,19 @@ end; function filterops_internal_event(kn:p_knote;hint:QWORD):Integer; begin + Result:=0; if (hint=0) then begin - Result:=ord(kn^.kn_kevent.data<>0); - end else - begin - Result:=0; if (kn^.kn_kevent.ident=hint) then begin - Result:=1; + Result:=Integer(kn^.kn_kevent.data); + end; + end else + begin + if (kn^.kn_kevent.ident=hint) then + begin kn^.kn_kevent.data:=1; + Result:=1; end; end; end; diff --git a/sys/kern/kern_event.pas b/sys/kern/kern_event.pas index 25cbe0ee..bed63811 100644 --- a/sys/kern/kern_event.pas +++ b/sys/kern/kern_event.pas @@ -36,11 +36,6 @@ function kqueue_acquire (fp:p_file;kqp:pp_kqueue):Integer; procedure kqueue_release (kq:p_kqueue;locked:Integer); function kqueue_expand (kq:p_kqueue;fops:p_filterops;ident:ptruint):Integer; procedure kqueue_task (arg:Pointer;pending:Integer); -function kqueue_scan (kq:p_kqueue; - maxevents:Integer; - k_ops:p_kevent_copyops; - tsp:p_timespec; - keva:p_kevent):Integer; procedure kqueue_wakeup (kq:p_kqueue); function kqueue_fo_find (filt:Integer):p_filterops; procedure kqueue_fo_release(filt:Integer); @@ -1012,6 +1007,13 @@ begin Result:=0; end; +function kqueue_scan(td:p_kthread; + kq:p_kqueue; + maxevents:Integer; + k_ops:p_kevent_copyops; + tsp:p_timespec; + keva:p_kevent):Integer; forward; + function _kern_kevent(td:p_kthread; kq:p_kqueue; nchanges:Integer; @@ -1073,7 +1075,7 @@ begin Exit(0); //goto done; end; - Result:=kqueue_scan(kq, nevents, k_ops, timeout, keva); + Result:=kqueue_scan(td, kq, nevents, k_ops, timeout, keva); end; function kern_kevent(fd:Integer; @@ -1801,18 +1803,18 @@ end; * Scan, update kn_data (if not ONESHOT), and copyout triggered events. * We treat KN_MARKER knotes as if they are INFLUX. } -function kqueue_scan(kq:p_kqueue; +function kqueue_scan(td:p_kthread; + kq:p_kqueue; maxevents:Integer; k_ops:p_kevent_copyops; tsp:p_timespec; - keva:p_kevent):Integer; + keva:p_kevent):Integer; inline; label done, done_nl, retry, start; var - td:p_kthread; kevp:p_kevent; atv,rtv,ttv:Int64; timeout:Int64; @@ -1820,12 +1822,9 @@ var count,nkev,error,influx:Integer; haskqglobal,touch:Integer; begin - td:=curkthread; - if (td=nil) then Exit(-1); - - count:=maxevents; - nkev:=0; - error:=0; + count :=maxevents; + nkev :=0; + error :=0; haskqglobal:=0; if (maxevents=0) then goto done_nl; @@ -1849,12 +1848,14 @@ begin atv:=0; timeout:=0; end; + marker:=knote_alloc(); if (marker=nil) then begin error:=ENOMEM; goto done_nl; end; + marker^.kn_status:=KN_MARKER; KQ_LOCK(kq); goto start; @@ -1899,6 +1900,7 @@ start: TAILQ_INSERT_TAIL(@kq^.kq_head,marker,@marker^.kn_tqe); influx:=0; + while (count<>0) do begin KQ_OWNED(kq); @@ -2039,19 +2041,25 @@ start: KQ_LOCK(kq); if (error<>0) then break; end; - end; + + end; //while (count<>0) do + TAILQ_REMOVE(@kq^.kq_head,marker,@marker^.kn_tqe); + done: KQ_OWNED(kq); KQ_UNLOCK_FLUX(kq); knote_free(marker); + done_nl: KQ_NOTOWNED(kq); if (nkev<>0) then begin error:=k_ops^.k_copyout(k_ops^.arg, keva, nkev); end; + td^.td_retval[0]:=maxevents - count; + Exit(error); end;