| Index: webkit/tools/pepper_test_plugin/plugin_object.cc
 | 
| ===================================================================
 | 
| --- webkit/tools/pepper_test_plugin/plugin_object.cc	(revision 35153)
 | 
| +++ webkit/tools/pepper_test_plugin/plugin_object.cc	(working copy)
 | 
| @@ -29,6 +29,8 @@
 | 
|  #include <string>
 | 
|  
 | 
|  #include "base/logging.h"
 | 
| +#include "gpu/command_buffer/client/gles2_lib.h"
 | 
| +#include "gpu/command_buffer/client/gles2_demo_cc.h"
 | 
|  #include "third_party/skia/include/core/SkBitmap.h"
 | 
|  #include "third_party/skia/include/core/SkCanvas.h"
 | 
|  #include "third_party/skia/include/effects/SkGradientShader.h"
 | 
| @@ -247,13 +249,6 @@
 | 
|      : npp_(npp),
 | 
|        test_object_(browser->createobject(npp, GetTestClass())),
 | 
|        device2d_(NULL) {
 | 
| -  if (!extensions) {
 | 
| -    browser->getvalue(npp_, NPNVPepperExtensions,
 | 
| -                      reinterpret_cast<void*>(&extensions));
 | 
| -    CHECK(extensions);
 | 
| -  }
 | 
| -  device2d_ = extensions->acquireDevice(npp, NPPepper2DDevice);
 | 
| -  CHECK(device2d_);
 | 
|  }
 | 
|  
 | 
|  PluginObject::~PluginObject() {
 | 
| @@ -266,24 +261,105 @@
 | 
|    return &plugin_class;
 | 
|  }
 | 
|  
 | 
| +namespace {
 | 
| +void Draw3DCallback(void* data) {
 | 
| +  static_cast<PluginObject*>(data)->Draw3D();
 | 
| +}
 | 
| +}
 | 
| +
 | 
| +void PluginObject::New(NPMIMEType pluginType,
 | 
| +                       int16 argc,
 | 
| +                       char* argn[],
 | 
| +                       char* argv[]) {
 | 
| +  // Default to 2D rendering.
 | 
| +  dimensions_ = 2;
 | 
| +
 | 
| +  for (int i = 0; i < argc; ++i) {
 | 
| +    if (strcmp(argn[i], "dimensions") == 0)
 | 
| +      dimensions_ = atoi(argv[i]);
 | 
| +  }
 | 
| +
 | 
| +  if (!extensions) {
 | 
| +    browser->getvalue(npp_, NPNVPepperExtensions,
 | 
| +                      reinterpret_cast<void*>(&extensions));
 | 
| +    CHECK(extensions);
 | 
| +  }
 | 
| +  device2d_ = extensions->acquireDevice(npp_, NPPepper2DDevice);
 | 
| +  CHECK(device2d_);
 | 
| +}
 | 
| +
 | 
|  void PluginObject::SetWindow(const NPWindow& window) {
 | 
| -  size_.set_width(window.width);
 | 
| -  size_.set_height(window.height);
 | 
| +  if (dimensions_ == 2) {
 | 
| +    size_.set_width(window.width);
 | 
| +    size_.set_height(window.height);
 | 
|  
 | 
| -  NPDeviceContext2DConfig config;
 | 
| -  NPDeviceContext2D context;
 | 
| -  device2d_->initializeContext(npp_, &config, &context);
 | 
| +    NPDeviceContext2DConfig config;
 | 
| +    NPDeviceContext2D context;
 | 
| +    device2d_->initializeContext(npp_, &config, &context);
 | 
|  
 | 
| -  SkBitmap bitmap;
 | 
| -  bitmap.setConfig(SkBitmap::kARGB_8888_Config, window.width, window.height);
 | 
| -  bitmap.setPixels(context.region);
 | 
| +    SkBitmap bitmap;
 | 
| +    bitmap.setConfig(SkBitmap::kARGB_8888_Config, window.width, window.height);
 | 
| +    bitmap.setPixels(context.region);
 | 
|  
 | 
| -  SkCanvas canvas(bitmap);
 | 
| -  DrawSampleBitmap(canvas, window.width, window.height);
 | 
| +    SkCanvas canvas(bitmap);
 | 
| +    DrawSampleBitmap(canvas, window.width, window.height);
 | 
|  
 | 
| -  // TODO(brettw) figure out why this cast is necessary, the functions seem to
 | 
| -  // match. Could be a calling convention mismatch?
 | 
| -  NPDeviceFlushContextCallbackPtr callback =
 | 
| -      reinterpret_cast<NPDeviceFlushContextCallbackPtr>(&FlushCallback);
 | 
| -  device2d_->flushContext(npp_, &context, callback, NULL);
 | 
| +    // TODO(brettw) figure out why this cast is necessary, the functions seem to
 | 
| +    // match. Could be a calling convention mismatch?
 | 
| +    NPDeviceFlushContextCallbackPtr callback =
 | 
| +        reinterpret_cast<NPDeviceFlushContextCallbackPtr>(&FlushCallback);
 | 
| +    device2d_->flushContext(npp_, &context, callback, NULL);
 | 
| +  } else {
 | 
| +    if (!command_buffer_.get()) {
 | 
| +      if (!InitializeCommandBuffer())
 | 
| +        return;
 | 
| +    }
 | 
| +
 | 
| +    gles2_implementation_->Viewport(0, 0, window.width, window.height);
 | 
| +
 | 
| +    // Schedule the first call to Draw.
 | 
| +    browser->pluginthreadasynccall(npp_, Draw3DCallback, this);
 | 
| +  }
 | 
|  }
 | 
| +
 | 
| +void PluginObject::Draw3D() {
 | 
| +  // Render some stuff.
 | 
| +  gles2::g_gl_impl = gles2_implementation_.get();
 | 
| +  GLFromCPPTestFunction();
 | 
| +  gles2::GetGLContext()->SwapBuffers();
 | 
| +  helper_->Flush();
 | 
| +  gles2::g_gl_impl = NULL;
 | 
| +
 | 
| +  // Schedule another call to Draw.
 | 
| +  browser->pluginthreadasynccall(npp_, Draw3DCallback, this);
 | 
| +}
 | 
| +
 | 
| +bool PluginObject::InitializeCommandBuffer() {
 | 
| +  const static int32 kCommandBufferSize = 512 * 1024;
 | 
| +  command_buffer_.reset(new CommandBufferPepper(npp_, browser));
 | 
| +  if (command_buffer_->Initialize(kCommandBufferSize)) {
 | 
| +    helper_.reset(new gpu::gles2::GLES2CmdHelper(command_buffer_.get()));
 | 
| +    if (helper_->Initialize()) {
 | 
| +
 | 
| +      const int32 kTransferBufferSize = 512 * 1024;
 | 
| +      int32 transfer_buffer_id =
 | 
| +          command_buffer_->CreateTransferBuffer(kTransferBufferSize);
 | 
| +      gpu::Buffer transfer_buffer =
 | 
| +          command_buffer_->GetTransferBuffer(transfer_buffer_id);
 | 
| +      if (transfer_buffer.ptr) {
 | 
| +        gles2_implementation_.reset(new gpu::gles2::GLES2Implementation(
 | 
| +            helper_.get(),
 | 
| +            transfer_buffer.size,
 | 
| +            transfer_buffer.ptr,
 | 
| +            transfer_buffer_id));
 | 
| +        return true;
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
| +    helper_.reset();
 | 
| +  }
 | 
| +
 | 
| +  command_buffer_.reset();
 | 
| +
 | 
| +  return false;
 | 
| +}
 | 
| 
 |