{
assert(
uwacErrorHandler(window->display, ret, "failed to reallocate a wayland buffers\n"));
- window->drawingBuffer = window->pendingBuffer = NULL;
+ window->drawingBufferIdx = window->pendingBufferIdx = -1;
return;
}
- window->drawingBuffer = &window->buffers[0];
- if (window->pendingBuffer != NULL)
- window->pendingBuffer = window->drawingBuffer;
+ window->drawingBufferIdx = 0;
+ if (window->pendingBufferIdx != -1)
+ window->pendingBufferIdx = window->drawingBufferIdx;
}
else
{
{
assert(
uwacErrorHandler(window->display, ret, "failed to reallocate a wayland buffers\n"));
- window->drawingBuffer = window->pendingBuffer = NULL;
+ window->drawingBufferIdx = window->pendingBufferIdx = -1;
return;
}
- window->drawingBuffer = &window->buffers[0];
- if (window->pendingBuffer != NULL)
- window->pendingBuffer = window->drawingBuffer;
+ window->drawingBufferIdx = 0;
+ if (window->pendingBufferIdx != -1)
+ window->pendingBufferIdx = window->drawingBufferIdx;
}
else
{
{
assert(
uwacErrorHandler(window->display, ret, "failed to reallocate a wayland buffers\n"));
- window->drawingBuffer = window->pendingBuffer = NULL;
+ window->drawingBufferIdx = window->pendingBufferIdx = -1;
return;
}
- window->drawingBuffer = &window->buffers[0];
- if (window->pendingBuffer != NULL)
- window->pendingBuffer = window->drawingBuffer;
+ window->drawingBufferIdx = 0;
+ if (window->pendingBufferIdx != -1)
+ window->pendingBufferIdx = window->drawingBufferIdx;
}
else
{
return ret;
}
-static UwacBuffer* UwacWindowFindFreeBuffer(UwacWindow* w)
+static UwacBuffer* UwacWindowFindFreeBuffer(UwacWindow* w, SSIZE_T* index)
{
- int i, ret;
+ SSIZE_T i;
+ int ret;
+
+ if (index)
+ *index = -1;
for (i = 0; i < w->nbuffers; i++)
{
if (!w->buffers[i].used)
{
w->buffers[i].used = true;
+ if (index)
+ *index = i;
return &w->buffers[i];
}
}
}
w->buffers[i].used = true;
+ if (index)
+ *index = i;
return &w->buffers[i];
}
}
w->buffers[0].used = true;
- w->drawingBuffer = &w->buffers[0];
+ w->drawingBufferIdx = 0;
+ w->pendingBufferIdx = -1;
w->surface = wl_compositor_create_surface(display->compositor);
if (!w->surface)
void* UwacWindowGetDrawingBuffer(UwacWindow* window)
{
- return window->drawingBuffer->data;
+ UwacBuffer* buffer;
+
+ if (window->drawingBufferIdx < 0)
+ return NULL;
+
+ buffer = &window->buffers[window->drawingBufferIdx];
+ if (!buffer)
+ return NULL;
+
+ return buffer->data;
}
static void frame_done_cb(void* data, struct wl_callback* callback, uint32_t time);
UwacFrameDoneEvent* event;
wl_callback_destroy(callback);
- window->pendingBuffer = NULL;
+ window->pendingBufferIdx = -1;
event = (UwacFrameDoneEvent*)UwacDisplayNewEvent(window->display, UWAC_EVENT_FRAME_DONE);
if (event)
uint32_t height)
{
RECTANGLE_16 box;
+ UwacBuffer* buf;
box.left = x;
box.top = y;
box.right = x + width;
box.bottom = y + height;
- UwacBuffer* buf = window->drawingBuffer;
+ if (window->drawingBufferIdx < 0)
+ return UWAC_ERROR_INTERNAL;
+
+ buf = &window->buffers[window->drawingBufferIdx];
+ if (!buf)
+ return UWAC_ERROR_INTERNAL;
+
if (!region16_union_rect(&buf->damage, &buf->damage, &box))
return UWAC_ERROR_INTERNAL;
UwacReturnCode UwacWindowGetDrawingBufferGeometry(UwacWindow* window, UwacSize* geometry,
size_t* stride)
{
- if (!window || !window->drawingBuffer)
+ if (!window || (window->drawingBufferIdx < 0))
return UWAC_ERROR_INTERNAL;
if (geometry)
UwacReturnCode UwacWindowSubmitBuffer(UwacWindow* window, bool copyContentForNextFrame)
{
- UwacBuffer* drawingBuffer = window->drawingBuffer;
+ UwacBuffer* drawingBuffer;
+ UwacBuffer* nextBuffer;
+
+ if (window->drawingBufferIdx < 0)
+ return UWAC_ERROR_INTERNAL;
+
+ drawingBuffer = &window->buffers[window->drawingBufferIdx];
- if (window->pendingBuffer || !drawingBuffer->dirty)
+ if ((window->pendingBufferIdx >= 0) || !drawingBuffer->dirty)
return UWAC_SUCCESS;
- window->pendingBuffer = drawingBuffer;
- window->drawingBuffer = UwacWindowFindFreeBuffer(window);
+ window->pendingBufferIdx = window->drawingBufferIdx;
+ nextBuffer = UwacWindowFindFreeBuffer(window, &window->drawingBufferIdx);
- if (!window->drawingBuffer)
+ if ((!nextBuffer) || (window->drawingBufferIdx < 0))
return UWAC_ERROR_NOMEMORY;
if (copyContentForNextFrame)
- memcpy(window->drawingBuffer->data, window->pendingBuffer->data,
- window->stride * window->height);
+ memcpy(nextBuffer->data, drawingBuffer->data, window->stride * window->height);
UwacSubmitBufferPtr(window, drawingBuffer);
return UWAC_SUCCESS;