void rend_end_render() { #if 1 //also disabled the printf, it takes quite some time ... #if HOST_OS!=OS_WINDOWS && !(defined(_ANDROID) || defined(TARGET_PANDORA)) if (!re.state) printf("Render > Extended time slice ...\n"); #endif #endif if (pend_rend) re.Wait(); }
void rend_end_render() { #if 1 //also disabled the printf, it takes quite some time ... #if HOST_OS!=OS_WINDOWS && !(defined(_ANDROID) || defined(TARGET_PANDORA)) //too much console spam. //TODO: how about a counter? //if (!re.state) printf("Render > Extended time slice ...\n"); #endif #endif if (pend_rend) re.Wait(); }
bool QueueRender(TA_context* ctx) { verify(ctx != 0); if (FrameSkipping && frameskip) { frameskip=1-frameskip; tactx_Recycle(ctx); fskip++; return false; } //Try to limit speed to a "sane" level //Speed is also limited via audio, but audio //is sometimes not accurate enough (android, vista+) u32 cycle_span = sh4_sched_now64() - last_cyces; last_cyces = sh4_sched_now64(); double time_span = os_GetSeconds() - last_frame; last_frame = os_GetSeconds(); bool too_fast = (cycle_span / time_span) > (SH4_MAIN_CLOCK * 1.2); if (rqueue && too_fast && settings.pvr.SynchronousRender) { //wait for a frame if // we have another one queue'd and // sh4 run at > 120% on the last slice // and SynchronousRendering is enabled frame_finished.Wait(); verify(!rqueue); } if (rqueue) { tactx_Recycle(ctx); fskip++; return false; } frame_finished.Reset(); mtx_rqueue.Lock(); TA_context* old = rqueue; rqueue=ctx; mtx_rqueue.Unlock(); verify(!old); return true; }
bool rend_single_frame() { //wait render start only if no frame pending do { rs.Wait(); _pvrrc = DequeueRender(); } while (!_pvrrc); bool do_swp = rend_frame(_pvrrc, true); //clear up & free data .. FinishRender(_pvrrc); _pvrrc=0; return do_swp; }
void WriteSample(s16 r, s16 l) { #ifdef LOG_SOUND rawout.Write(l,r); #endif speed_limit.Reset(); if (!asRingFreeCount()) { if (settings.LimitFPS) { speed_limit.Wait(); } else return; } gen_samples++; //while limit on, 128 samples done, there is a buffer ready to be service AND speed is too fast then wait ;p while (settings.LimitFPS==1 && gen_samples>128 && asRingUsedCount()>BufferSampleCount && QueryPerformanceCounter(&time_now) && (time_now.QuadPart-time_last.QuadPart)<=time_diff.QuadPart ) { __noop; } if (settings.LimitFPS==1 && gen_samples>128) { gen_samples=0; QueryPerformanceCounter(&time_last); } const u32 ptr=(WritePtr+1)%RingBufferSampleCount; RingBuffer[ptr].r=r; RingBuffer[ptr].l=l; WritePtr=ptr; //if (0==(WritePtr&255)) //printf("write done %d %d \n",ReadPtr,WritePtr); }
bool rend_single_frame() { //wait render start only if no frame pending do { rs.Wait(); _pvrrc = DequeueRender(); } while (!_pvrrc); bool proc = renderer->Process(_pvrrc); re.Set(); bool do_swp = proc && renderer->Render(); if (do_swp) renderer->DrawOSD(); //clear up & free data .. FinishRender(_pvrrc); _pvrrc=0; return do_swp; }