mirror of
				https://github.com/gnif/LookingGlass.git
				synced 2025-11-04 06:31:54 +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->texWIndex  = 0;
 | 
				
			||||||
  this->texReady   = 0;
 | 
					  this->texReady   = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  os_resetEvent(this->frameEvent  );
 | 
				
			||||||
 | 
					  os_resetEvent(this->pointerEvent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  status = CreateDXGIFactory1(&IID_IDXGIFactory1, (void **)&this->factory);
 | 
					  status = CreateDXGIFactory1(&IID_IDXGIFactory1, (void **)&this->factory);
 | 
				
			||||||
  if (FAILED(status))
 | 
					  if (FAILED(status))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -162,6 +162,7 @@ static int frameThread(void * opaque)
 | 
				
			|||||||
  volatile KVMFRFrame * fi = &(app.shmHeader->frame);
 | 
					  volatile KVMFRFrame * fi = &(app.shmHeader->frame);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool         frameValid     = false;
 | 
					  bool         frameValid     = false;
 | 
				
			||||||
 | 
					  bool         repeatFrame    = false;
 | 
				
			||||||
  int          frameIndex     = 0;
 | 
					  int          frameIndex     = 0;
 | 
				
			||||||
  unsigned int clientInstance = 0;
 | 
					  unsigned int clientInstance = 0;
 | 
				
			||||||
  CaptureFrame frame          = { 0 };
 | 
					  CaptureFrame frame          = { 0 };
 | 
				
			||||||
@@ -171,6 +172,7 @@ static int frameThread(void * opaque)
 | 
				
			|||||||
    switch(app.iface->waitFrame(&frame))
 | 
					    switch(app.iface->waitFrame(&frame))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      case CAPTURE_RESULT_OK:
 | 
					      case CAPTURE_RESULT_OK:
 | 
				
			||||||
 | 
					        repeatFrame = false;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case CAPTURE_RESULT_REINIT:
 | 
					      case CAPTURE_RESULT_REINIT:
 | 
				
			||||||
@@ -191,8 +193,7 @@ static int frameThread(void * opaque)
 | 
				
			|||||||
        if (frameValid && clientInstance != app.clientInstance)
 | 
					        if (frameValid && clientInstance != app.clientInstance)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          // resend the last frame
 | 
					          // resend the last frame
 | 
				
			||||||
          if (--frameIndex < 0)
 | 
					          repeatFrame = true;
 | 
				
			||||||
            frameIndex = MAX_FRAMES - 1;
 | 
					 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -206,28 +207,33 @@ static int frameThread(void * opaque)
 | 
				
			|||||||
    while(fi->flags & KVMFR_FRAME_FLAG_UPDATE && app.running)
 | 
					    while(fi->flags & KVMFR_FRAME_FLAG_UPDATE && app.running)
 | 
				
			||||||
      usleep(1000);
 | 
					      usleep(1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch(frame.format)
 | 
					    if (repeatFrame)
 | 
				
			||||||
 | 
					      INTERLOCKED_OR8(&fi->flags, KVMFR_FRAME_FLAG_UPDATE);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      case CAPTURE_FMT_BGRA  : fi->type = FRAME_TYPE_BGRA  ; break;
 | 
					      switch(frame.format)
 | 
				
			||||||
      case CAPTURE_FMT_RGBA  : fi->type = FRAME_TYPE_RGBA  ; break;
 | 
					      {
 | 
				
			||||||
      case CAPTURE_FMT_RGBA10: fi->type = FRAME_TYPE_RGBA10; break;
 | 
					        case CAPTURE_FMT_BGRA  : fi->type = FRAME_TYPE_BGRA  ; break;
 | 
				
			||||||
      case CAPTURE_FMT_YUV420: fi->type = FRAME_TYPE_YUV420; break;
 | 
					        case CAPTURE_FMT_RGBA  : fi->type = FRAME_TYPE_RGBA  ; break;
 | 
				
			||||||
      default:
 | 
					        case CAPTURE_FMT_RGBA10: fi->type = FRAME_TYPE_RGBA10; break;
 | 
				
			||||||
        DEBUG_ERROR("Unsupported frame format %d, skipping frame", frame.format);
 | 
					        case CAPTURE_FMT_YUV420: fi->type = FRAME_TYPE_YUV420; break;
 | 
				
			||||||
        continue;
 | 
					        default:
 | 
				
			||||||
 | 
					          DEBUG_ERROR("Unsupported frame format %d, skipping frame", frame.format);
 | 
				
			||||||
 | 
					          continue;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      fi->width   = frame.width;
 | 
				
			||||||
 | 
					      fi->height  = frame.height;
 | 
				
			||||||
 | 
					      fi->stride  = frame.stride;
 | 
				
			||||||
 | 
					      fi->pitch   = frame.pitch;
 | 
				
			||||||
 | 
					      fi->dataPos = app.frameOffset[frameIndex];
 | 
				
			||||||
 | 
					      frameValid  = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      framebuffer_prepare(app.frame[frameIndex]);
 | 
				
			||||||
 | 
					      INTERLOCKED_OR8(&fi->flags, KVMFR_FRAME_FLAG_UPDATE);
 | 
				
			||||||
 | 
					      app.iface->getFrame(app.frame[frameIndex]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fi->width   = frame.width;
 | 
					 | 
				
			||||||
    fi->height  = frame.height;
 | 
					 | 
				
			||||||
    fi->stride  = frame.stride;
 | 
					 | 
				
			||||||
    fi->pitch   = frame.pitch;
 | 
					 | 
				
			||||||
    fi->dataPos = app.frameOffset[frameIndex];
 | 
					 | 
				
			||||||
    frameValid  = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    framebuffer_prepare(app.frame[frameIndex]);
 | 
					 | 
				
			||||||
    INTERLOCKED_OR8(&fi->flags, KVMFR_FRAME_FLAG_UPDATE);
 | 
					 | 
				
			||||||
    app.iface->getFrame(app.frame[frameIndex]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (++frameIndex == MAX_FRAMES)
 | 
					    if (++frameIndex == MAX_FRAMES)
 | 
				
			||||||
      frameIndex = 0;
 | 
					      frameIndex = 0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user