diff options
-rw-r--r-- | src/waffle/nacl/nacl_container.cpp | 12 | ||||
-rw-r--r-- | src/waffle/nacl/nacl_container.h | 2 | ||||
-rw-r--r-- | src/waffle/nacl/nacl_swap_thread.h | 94 | ||||
-rw-r--r-- | src/waffle/nacl/nacl_window.c | 3 |
4 files changed, 109 insertions, 2 deletions
diff --git a/src/waffle/nacl/nacl_container.cpp b/src/waffle/nacl/nacl_container.cpp index fe907ff..84ab1da 100644 --- a/src/waffle/nacl/nacl_container.cpp +++ b/src/waffle/nacl/nacl_container.cpp @@ -28,11 +28,13 @@ #include "ppapi/cpp/module.h" #include "ppapi/c/pp_errors.h" #include "nacl_container.h" +#include "nacl_swap_thread.h" namespace waffle { struct nacl_container { pp::Graphics3D *ctx; + NaclSwapThread *swapper; void *glapi; bool (*glInitializePPAPI) (PPB_GetInterface); @@ -49,6 +51,7 @@ nacl_container_dtor(waffle::nacl_container *nc) if (nc->glapi) dlclose(nc->glapi); + delete nc->swapper; delete nc; } @@ -119,6 +122,7 @@ nacl_context_init(waffle::nacl_container *nc, struct nacl_config *cfg) return false; } + nc->swapper = new NaclSwapThread(pp_instance, nc->ctx); return true; } @@ -194,3 +198,11 @@ nacl_makecurrent(nacl_container *nc, bool release) return true; } + +extern "C" bool +nacl_swapbuffers(nacl_container *nc) +{ + waffle::nacl_container *cpp_nc = + reinterpret_cast<waffle::nacl_container*>(nc); + return cpp_nc->swapper->swap(); +} diff --git a/src/waffle/nacl/nacl_container.h b/src/waffle/nacl/nacl_container.h index ca26a1f..579856d 100644 --- a/src/waffle/nacl/nacl_container.h +++ b/src/waffle/nacl/nacl_container.h @@ -43,7 +43,7 @@ bool nacl_context_init(struct nacl_container *nc, struct nacl_config *cfg); bool nacl_resize(struct nacl_container *nc, int32_t width, int32_t height); bool nacl_makecurrent(struct nacl_container *nc, bool release); void nacl_context_fini(struct nacl_container *nc); - +bool nacl_swapbuffers(struct nacl_container *nc); #ifdef __cplusplus }; #endif diff --git a/src/waffle/nacl/nacl_swap_thread.h b/src/waffle/nacl/nacl_swap_thread.h new file mode 100644 index 0000000..8e8687b --- /dev/null +++ b/src/waffle/nacl/nacl_swap_thread.h @@ -0,0 +1,94 @@ +// Copyright 2014 Intel Corporation +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "ppapi/cpp/graphics_3d.h" +#include "ppapi/cpp/instance.h" +#include "ppapi/utility/completion_callback_factory.h" +#include "ppapi/utility/threading/simple_thread.h" +#include "wcore_error.h" +#include <semaphore.h> + +// Thread takes care that we do not issue another buffer +// swap before previous swap has completed. +class NaclSwapThread : public pp::SimpleThread +{ +public: + explicit NaclSwapThread(const pp::InstanceHandle &instance, + pp::Graphics3D *_ctx) : + pp::SimpleThread(instance), + ctx(_ctx), + cbf(this) + { + Start(); + sem_init(&sem, 0, 0); + } + + ~NaclSwapThread() + { + sem_destroy(&sem); + message_loop().PostQuit(true); + } + + bool swap() + { + pp::CompletionCallback cb = + cbf.NewCallback(&NaclSwapThread::swap_buffers); + + if (message_loop().PostWork(cb) != PP_OK) + return false; + + sem_wait(&sem); + + return true; + } + +private: + + void swap_buffers(int32_t result) + { + int32_t error = ctx->SwapBuffers(pp::BlockUntilComplete()); + switch (error) { + case PP_OK: + break; + case PP_ERROR_NOMEMORY: + wcore_errorf(WAFFLE_ERROR_BAD_ALLOC, + "pp::Graphics3D::SwapBuffers: Out of memory."); + break; + case PP_ERROR_CONTEXT_LOST: + wcore_errorf(WAFFLE_ERROR_FATAL, + "pp::Graphics3D::SwapBuffers: 3D context lost."); + break; + default: + wcore_errorf(WAFFLE_ERROR_UNKNOWN, + "pp::Graphics3D::SwapBuffers: Unknown error."); + break; + } + sem_post(&sem); + } + + pp::Graphics3D *ctx; + pp::CompletionCallbackFactory<NaclSwapThread> cbf; + sem_t sem; +}; diff --git a/src/waffle/nacl/nacl_window.c b/src/waffle/nacl/nacl_window.c index 7b7121f..5ac031c 100644 --- a/src/waffle/nacl/nacl_window.c +++ b/src/waffle/nacl/nacl_window.c @@ -97,5 +97,6 @@ nacl_window_resize(struct wcore_window *wc_self, bool nacl_window_swap_buffers(struct wcore_window *wc_self) { - return false; + struct nacl_platform *plat = nacl_platform(wc_self->display->platform); + return nacl_swapbuffers(plat->nacl); } |