mirror of
				https://github.com/gnif/LookingGlass.git
				synced 2025-11-03 22:22:08 +00:00 
			
		
		
		
	[c-host] dxgi: fix segfault with maxTextures=1 on client reconnect
This commit is contained in:
		@@ -222,6 +222,9 @@ static bool dxgi_init(void * pointerShape, const unsigned int pointerSize)
 | 
			
		||||
  this->texWIndex  = 0;
 | 
			
		||||
  this->texReady   = 0;
 | 
			
		||||
 | 
			
		||||
  os_resetEvent(this->frameEvent  );
 | 
			
		||||
  os_resetEvent(this->pointerEvent);
 | 
			
		||||
 | 
			
		||||
  status = CreateDXGIFactory1(&IID_IDXGIFactory1, (void **)&this->factory);
 | 
			
		||||
  if (FAILED(status))
 | 
			
		||||
  {
 | 
			
		||||
 
 | 
			
		||||
@@ -162,6 +162,7 @@ static int frameThread(void * opaque)
 | 
			
		||||
  volatile KVMFRFrame * fi = &(app.shmHeader->frame);
 | 
			
		||||
 | 
			
		||||
  bool         frameValid     = false;
 | 
			
		||||
  bool         repeatFrame    = false;
 | 
			
		||||
  int          frameIndex     = 0;
 | 
			
		||||
  unsigned int clientInstance = 0;
 | 
			
		||||
  CaptureFrame frame          = { 0 };
 | 
			
		||||
@@ -171,6 +172,7 @@ static int frameThread(void * opaque)
 | 
			
		||||
    switch(app.iface->waitFrame(&frame))
 | 
			
		||||
    {
 | 
			
		||||
      case CAPTURE_RESULT_OK:
 | 
			
		||||
        repeatFrame = false;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      case CAPTURE_RESULT_REINIT:
 | 
			
		||||
@@ -191,8 +193,7 @@ static int frameThread(void * opaque)
 | 
			
		||||
        if (frameValid && clientInstance != app.clientInstance)
 | 
			
		||||
        {
 | 
			
		||||
          // resend the last frame
 | 
			
		||||
          if (--frameIndex < 0)
 | 
			
		||||
            frameIndex = MAX_FRAMES - 1;
 | 
			
		||||
          repeatFrame = true;
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -206,6 +207,10 @@ static int frameThread(void * opaque)
 | 
			
		||||
    while(fi->flags & KVMFR_FRAME_FLAG_UPDATE && app.running)
 | 
			
		||||
      usleep(1000);
 | 
			
		||||
 | 
			
		||||
    if (repeatFrame)
 | 
			
		||||
      INTERLOCKED_OR8(&fi->flags, KVMFR_FRAME_FLAG_UPDATE);
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      switch(frame.format)
 | 
			
		||||
      {
 | 
			
		||||
        case CAPTURE_FMT_BGRA  : fi->type = FRAME_TYPE_BGRA  ; break;
 | 
			
		||||
@@ -227,6 +232,7 @@ static int frameThread(void * opaque)
 | 
			
		||||
      framebuffer_prepare(app.frame[frameIndex]);
 | 
			
		||||
      INTERLOCKED_OR8(&fi->flags, KVMFR_FRAME_FLAG_UPDATE);
 | 
			
		||||
      app.iface->getFrame(app.frame[frameIndex]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (++frameIndex == MAX_FRAMES)
 | 
			
		||||
      frameIndex = 0;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user