Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Unified Diff: webkit/plugins/ppapi/ppb_context_3d_impl.cc

Issue 7206016: Convert most remaining resources to use the API/thunk system. The significant (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/plugins/ppapi/ppb_context_3d_impl.cc
===================================================================
--- webkit/plugins/ppapi/ppb_context_3d_impl.cc (revision 89610)
+++ webkit/plugins/ppapi/ppb_context_3d_impl.cc (working copy)
@@ -10,10 +10,15 @@
#include "gpu/command_buffer/client/gles2_implementation.h"
#include "gpu/command_buffer/common/command_buffer.h"
#include "ppapi/c/dev/ppb_context_3d_trusted_dev.h"
+#include "ppapi/thunk/enter.h"
#include "webkit/plugins/ppapi/common.h"
#include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
#include "webkit/plugins/ppapi/ppb_surface_3d_impl.h"
+using ppapi::thunk::EnterResourceNoLock;
+using ppapi::thunk::PPB_Context3D_API;
+using ppapi::thunk::PPB_Surface3D_API;
+
namespace webkit {
namespace ppapi {
@@ -23,23 +28,29 @@
const int32 kCommandBufferSize = 1024 * 1024;
const int32 kTransferBufferSize = 1024 * 1024;
-bool ShmToHandle(base::SharedMemory* shm,
- size_t size,
- int* shm_handle,
- uint32_t* shm_size) {
+PP_Bool ShmToHandle(base::SharedMemory* shm,
+ size_t size,
+ int* shm_handle,
+ uint32_t* shm_size) {
if (!shm || !shm_handle || !shm_size)
- return false;
+ return PP_FALSE;
#if defined(OS_POSIX)
- *shm_handle = shm->handle().fd;
+ *shm_handle = shm->handle().fd;
#elif defined(OS_WIN)
- *shm_handle = reinterpret_cast<int>(shm->handle());
+ *shm_handle = reinterpret_cast<int>(shm->handle());
#else
- #error "Platform not supported."
+ #error "Platform not supported."
#endif
- *shm_size = size;
- return true;
+ *shm_size = size;
+ return PP_TRUE;
}
+PP_Context3DTrustedState GetErrorState() {
+ PP_Context3DTrustedState error_state = { 0 };
+ error_state.error = kGenericError;
+ return error_state;
+}
+
PP_Context3DTrustedState PPStateFromGPUState(gpu::CommandBuffer::State s) {
PP_Context3DTrustedState state = {
s.num_entries,
@@ -52,16 +63,32 @@
return state;
}
-PP_Resource Create(PP_Instance instance_id,
- PP_Config3D_Dev config,
- PP_Resource share_context,
- const int32_t* attrib_list) {
+} // namespace
+
+PPB_Context3D_Impl::PPB_Context3D_Impl(PluginInstance* instance)
+ : Resource(instance),
+ instance_(instance),
+ transfer_buffer_id_(0),
+ draw_surface_(NULL),
+ read_surface_(NULL),
+ callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
+}
+
+PPB_Context3D_Impl::~PPB_Context3D_Impl() {
+ Destroy();
+}
+
+// static
+PP_Resource PPB_Context3D_Impl::Create(PP_Instance pp_instance,
+ PP_Config3D_Dev config,
+ PP_Resource share_context,
+ const int32_t* attrib_list) {
// TODO(alokp): Support shared context.
DCHECK_EQ(0, share_context);
if (share_context != 0)
return 0;
- PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id);
+ PluginInstance* instance = ResourceTracker::Get()->GetInstance(pp_instance);
if (!instance)
return 0;
@@ -73,63 +100,17 @@
return context->GetReference();
}
-PP_Bool IsContext3D(PP_Resource resource) {
- return BoolToPPBool(!!Resource::GetAs<PPB_Context3D_Impl>(resource));
-}
-
-int32_t GetAttrib(PP_Resource context,
- int32_t attribute,
- int32_t* value) {
- // TODO(alokp): Implement me.
- return 0;
-}
-
-int32_t BindSurfaces(PP_Resource context_id,
- PP_Resource draw,
- PP_Resource read) {
- scoped_refptr<PPB_Context3D_Impl> context(
- Resource::GetAs<PPB_Context3D_Impl>(context_id));
- if (!context.get())
- return PP_ERROR_BADRESOURCE;
-
- scoped_refptr<PPB_Surface3D_Impl> draw_surface(
- Resource::GetAs<PPB_Surface3D_Impl>(draw));
- if (!draw_surface.get())
- return PP_ERROR_BADRESOURCE;
-
- scoped_refptr<PPB_Surface3D_Impl> read_surface(
- Resource::GetAs<PPB_Surface3D_Impl>(read));
- if (!read_surface.get())
- return PP_ERROR_BADRESOURCE;
-
- return context->BindSurfaces(draw_surface.get(), read_surface.get());
-}
-
-int32_t GetBoundSurfaces(PP_Resource context,
- PP_Resource* draw,
- PP_Resource* read) {
- // TODO(alokp): Implement me.
- return 0;
-}
-
-const PPB_Context3D_Dev ppb_context3d = {
- &Create,
- &IsContext3D,
- &GetAttrib,
- &BindSurfaces,
- &GetBoundSurfaces,
-};
-
-PP_Resource CreateRaw(PP_Instance instance_id,
- PP_Config3D_Dev config,
- PP_Resource share_context,
- const int32_t* attrib_list) {
+// static
+PP_Resource PPB_Context3D_Impl::CreateRaw(PP_Instance pp_instance,
+ PP_Config3D_Dev config,
+ PP_Resource share_context,
+ const int32_t* attrib_list) {
// TODO(alokp): Support shared context.
DCHECK_EQ(0, share_context);
if (share_context != 0)
return 0;
- PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id);
+ PluginInstance* instance = ResourceTracker::Get()->GetInstance(pp_instance);
if (!instance)
return 0;
@@ -141,142 +122,157 @@
return context->GetReference();
}
-PP_Bool Initialize(PP_Resource context_id, int32_t size) {
- scoped_refptr<PPB_Context3D_Impl> context(
- Resource::GetAs<PPB_Context3D_Impl>(context_id));
- if (!context.get() || !context->command_buffer())
- return PP_FALSE;
- return context->command_buffer()->Initialize(size) ? PP_TRUE : PP_FALSE;
+PPB_Context3D_API* PPB_Context3D_Impl::AsPPB_Context3D_API() {
+ return this;
}
-PP_Bool GetRingBuffer(PP_Resource context_id,
- int* shm_handle,
- uint32_t* shm_size) {
- scoped_refptr<PPB_Context3D_Impl> context(
- Resource::GetAs<PPB_Context3D_Impl>(context_id));
- if (!context.get() || !context->command_buffer())
- return PP_FALSE;
+int32_t PPB_Context3D_Impl::GetAttrib(int32_t attribute, int32_t* value) {
+ // TODO(alokp): Implement me.
+ return 0;
+}
- gpu::Buffer buffer = context->command_buffer()->GetRingBuffer();
+int32_t PPB_Context3D_Impl::BindSurfaces(PP_Resource draw, PP_Resource read) {
+ EnterResourceNoLock<PPB_Surface3D_API> enter_draw(draw, true);
+ if (enter_draw.failed())
+ return PP_ERROR_BADRESOURCE;
+ PPB_Surface3D_Impl* new_draw =
+ static_cast<PPB_Surface3D_Impl*>(enter_draw.object());
- return ShmToHandle(buffer.shared_memory, buffer.size, shm_handle, shm_size)
- ? PP_TRUE : PP_FALSE;
+ EnterResourceNoLock<PPB_Surface3D_API> enter_read(read, true);
+ if (enter_read.failed())
+ return PP_ERROR_BADRESOURCE;
+ PPB_Surface3D_Impl* new_read =
+ static_cast<PPB_Surface3D_Impl*>(enter_read.object());
+
+ // TODO(alokp): Support separate draw-read surfaces.
+ DCHECK_EQ(new_draw, new_read);
+ if (new_draw != new_read)
+ return PP_GRAPHICS3DERROR_BAD_MATCH;
+
+ if (new_draw == draw_surface_)
+ return PP_OK;
+
+ if (new_draw->context())
+ return PP_GRAPHICS3DERROR_BAD_ACCESS; // Already bound.
+
+ if (draw_surface_)
+ draw_surface_->BindToContext(NULL);
+ if (!new_draw->BindToContext(this))
+ return PP_ERROR_NOMEMORY;
+
+ draw_surface_ = new_draw;
+ read_surface_ = new_read;
+ return PP_OK;
}
-PP_Context3DTrustedState GetState(PP_Resource context_id) {
- scoped_refptr<PPB_Context3D_Impl> context(
- Resource::GetAs<PPB_Context3D_Impl>(context_id));
- if (!context.get() || !context->command_buffer()) {
- PP_Context3DTrustedState error_state = { 0 };
- return error_state;
- }
+int32_t PPB_Context3D_Impl::GetBoundSurfaces(PP_Resource* draw,
+ PP_Resource* read) {
+ // TODO(alokp): Implement me.
+ return 0;
+}
- return PPStateFromGPUState(context->command_buffer()->GetState());
+PP_Bool PPB_Context3D_Impl::InitializeTrusted(int32_t size) {
+ if (!platform_context_.get())
+ return PP_FALSE;
+ return PP_FromBool(platform_context_->GetCommandBuffer()->Initialize(size));
}
-PP_Bool Flush(PP_Resource context_id, int32_t put_offset) {
- scoped_refptr<PPB_Context3D_Impl> context(
- Resource::GetAs<PPB_Context3D_Impl>(context_id));
- if (!context.get() || !context->command_buffer())
+PP_Bool PPB_Context3D_Impl::GetRingBuffer(int* shm_handle,
+ uint32_t* shm_size) {
+ if (!platform_context_.get())
return PP_FALSE;
+ gpu::Buffer buffer = platform_context_->GetCommandBuffer()->GetRingBuffer();
+ return ShmToHandle(buffer.shared_memory, buffer.size, shm_handle, shm_size);
+}
- context->command_buffer()->Flush(put_offset);
+PP_Context3DTrustedState PPB_Context3D_Impl::GetState() {
+ if (!platform_context_.get())
+ return GetErrorState();
+ return PPStateFromGPUState(platform_context_->GetCommandBuffer()->GetState());
+}
+
+PP_Bool PPB_Context3D_Impl::Flush(int32_t put_offset) {
+ if (!platform_context_.get())
+ return PP_FALSE;
+ platform_context_->GetCommandBuffer()->Flush(put_offset);
return PP_TRUE;
}
-PP_Context3DTrustedState FlushSync(PP_Resource context_id, int32_t put_offset) {
- scoped_refptr<PPB_Context3D_Impl> context(
- Resource::GetAs<PPB_Context3D_Impl>(context_id));
- if (!context.get() || !context->command_buffer()) {
- PP_Context3DTrustedState error_state = { 0 };
- return error_state;
- }
-
- gpu::CommandBuffer::State state = context->command_buffer()->GetState();
+PP_Context3DTrustedState PPB_Context3D_Impl::FlushSync(int32_t put_offset) {
+ if (!platform_context_.get())
+ return GetErrorState();
+ gpu::CommandBuffer::State state =
+ platform_context_->GetCommandBuffer()->GetState();
return PPStateFromGPUState(
- context->command_buffer()->FlushSync(put_offset, state.get_offset));
+ platform_context_->GetCommandBuffer()->FlushSync(put_offset,
+ state.get_offset));
}
-int32_t CreateTransferBuffer(PP_Resource context_id, uint32_t size) {
- scoped_refptr<PPB_Context3D_Impl> context(
- Resource::GetAs<PPB_Context3D_Impl>(context_id));
- if (!context.get() || !context->command_buffer())
+int32_t PPB_Context3D_Impl::CreateTransferBuffer(uint32_t size) {
+ if (!platform_context_.get())
return 0;
- return context->command_buffer()->CreateTransferBuffer(size, -1);
+ return platform_context_->GetCommandBuffer()->CreateTransferBuffer(size, -1);
}
-PP_Bool DestroyTransferBuffer(PP_Resource context_id, int32_t id) {
- scoped_refptr<PPB_Context3D_Impl> context(
- Resource::GetAs<PPB_Context3D_Impl>(context_id));
- if (!context.get() || !context->command_buffer())
+PP_Bool PPB_Context3D_Impl::DestroyTransferBuffer(int32_t id) {
+ if (!platform_context_.get())
return PP_FALSE;
- context->command_buffer()->DestroyTransferBuffer(id);
+ platform_context_->GetCommandBuffer()->DestroyTransferBuffer(id);
return PP_TRUE;
}
-PP_Bool GetTransferBuffer(PP_Resource context_id,
- int32_t id,
- int* shm_handle,
- uint32_t* shm_size) {
- scoped_refptr<PPB_Context3D_Impl> context(
- Resource::GetAs<PPB_Context3D_Impl>(context_id));
- if (!context.get() || !context->command_buffer())
+PP_Bool PPB_Context3D_Impl::GetTransferBuffer(int32_t id,
+ int* shm_handle,
+ uint32_t* shm_size) {
+ if (!platform_context_.get())
return PP_FALSE;
- gpu::Buffer buffer = context->command_buffer()->GetTransferBuffer(id);
-
- return ShmToHandle(buffer.shared_memory, buffer.size, shm_handle, shm_size)
- ? PP_TRUE : PP_FALSE;
+ gpu::Buffer buffer =
+ platform_context_->GetCommandBuffer()->GetTransferBuffer(id);
+ return ShmToHandle(buffer.shared_memory, buffer.size, shm_handle, shm_size);
}
-PP_Context3DTrustedState FlushSyncFast(
- PP_Resource context_id, int32_t put_offset, int32 last_known_get) {
- scoped_refptr<PPB_Context3D_Impl> context(
- Resource::GetAs<PPB_Context3D_Impl>(context_id));
- if (!context.get() || !context->command_buffer()) {
- PP_Context3DTrustedState error_state = { 0 };
- return error_state;
- }
-
+PP_Context3DTrustedState PPB_Context3D_Impl::FlushSyncFast(
+ int32_t put_offset,
+ int32_t last_known_get) {
+ if (!platform_context_.get())
+ return GetErrorState();
return PPStateFromGPUState(
- context->command_buffer()->FlushSync(put_offset, last_known_get));
+ platform_context_->GetCommandBuffer()->FlushSync(put_offset,
+ last_known_get));
}
-} // namespace
-PPB_Context3D_Impl::PPB_Context3D_Impl(PluginInstance* instance)
- : Resource(instance),
- instance_(instance),
- transfer_buffer_id_(0),
- draw_surface_(NULL),
- read_surface_(NULL),
- callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
+void* PPB_Context3D_Impl::MapTexSubImage2DCHROMIUM(GLenum target,
+ GLint level,
+ GLint xoffset,
+ GLint yoffset,
+ GLsizei width,
+ GLsizei height,
+ GLenum format,
+ GLenum type,
+ GLenum access) {
+ if (!gles2_impl_.get())
+ return NULL;
+ return gles2_impl_->MapTexSubImage2DCHROMIUM(
+ target, level, xoffset, yoffset, width, height, format, type, access);
}
-PPB_Context3D_Impl::~PPB_Context3D_Impl() {
- Destroy();
+void PPB_Context3D_Impl::UnmapTexSubImage2DCHROMIUM(const void* mem) {
+ if (gles2_impl_.get())
+ gles2_impl_->UnmapTexSubImage2DCHROMIUM(mem);
}
-const PPB_Context3D_Dev* PPB_Context3D_Impl::GetInterface() {
- return &ppb_context3d;
-}
+bool PPB_Context3D_Impl::Init(PP_Config3D_Dev config,
+ PP_Resource share_context,
+ const int32_t* attrib_list) {
+ if (!InitRaw(config, share_context, attrib_list))
+ return false;
-const PPB_Context3DTrusted_Dev* PPB_Context3D_Impl::GetTrustedInterface() {
- static const PPB_Context3DTrusted_Dev iface = {
- &CreateRaw,
- &Initialize,
- &GetRingBuffer,
- &GetState,
- &Flush,
- &FlushSync,
- &CreateTransferBuffer,
- &DestroyTransferBuffer,
- &GetTransferBuffer,
- &FlushSyncFast,
- };
- return &iface;
-}
+ if (!CreateImplementation()) {
+ Destroy();
+ return false;
+ }
-PPB_Context3D_Impl* PPB_Context3D_Impl::AsPPB_Context3D_Impl() {
- return this;
+ return true;
}
bool PPB_Context3D_Impl::InitRaw(PP_Config3D_Dev config,
@@ -297,20 +293,6 @@
return true;
}
-bool PPB_Context3D_Impl::Init(PP_Config3D_Dev config,
- PP_Resource share_context,
- const int32_t* attrib_list) {
- if (!InitRaw(config, share_context, attrib_list))
- return false;
-
- if (!CreateImplementation()) {
- Destroy();
- return false;
- }
-
- return true;
-}
-
bool PPB_Context3D_Impl::CreateImplementation() {
gpu::CommandBuffer* command_buffer = platform_context_->GetCommandBuffer();
DCHECK(command_buffer);
@@ -347,37 +329,15 @@
return true;
}
-int32_t PPB_Context3D_Impl::BindSurfaces(PPB_Surface3D_Impl* draw,
- PPB_Surface3D_Impl* read) {
- // TODO(alokp): Support separate draw-read surfaces.
- DCHECK_EQ(draw, read);
- if (draw != read)
- return PP_GRAPHICS3DERROR_BAD_MATCH;
-
- if (draw == draw_surface_)
- return PP_OK;
-
- if (draw && draw->context())
- return PP_GRAPHICS3DERROR_BAD_ACCESS;
-
- if (draw_surface_)
- draw_surface_->BindToContext(NULL);
- if (draw && !draw->BindToContext(this))
- return PP_ERROR_NOMEMORY;
-
- draw_surface_ = draw;
- read_surface_ = read;
- return PP_OK;
-}
-
void PPB_Context3D_Impl::Destroy() {
if (draw_surface_)
draw_surface_->BindToContext(NULL);
gles2_impl_.reset();
- if (command_buffer() && transfer_buffer_id_ != 0) {
- command_buffer()->DestroyTransferBuffer(transfer_buffer_id_);
+ if (platform_context_.get() && transfer_buffer_id_ != 0) {
+ platform_context_->GetCommandBuffer()->DestroyTransferBuffer(
+ transfer_buffer_id_);
transfer_buffer_id_ = 0;
}
@@ -392,10 +352,6 @@
read_surface_->OnContextLost();
}
-gpu::CommandBuffer *PPB_Context3D_Impl::command_buffer() {
- return platform_context_.get() ? platform_context_->GetCommandBuffer() : NULL;
-}
-
} // namespace ppapi
} // namespace webkit

Powered by Google App Engine
This is Rietveld 408576698