[c-host] dxgi: fix segfault with maxTextures=1 on client reconnect

This commit is contained in:
Geoffrey McRae 2019-12-17 20:56:14 +11:00
parent 8ada29e25f
commit 0bd19cfd38
2 changed files with 30 additions and 21 deletions

View File

@ -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))
{ {

View File

@ -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;
} }