OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "gpu/gles2_conform_support/egl/display.h" |
| 6 |
| 7 #include <vector> |
| 8 #include "gpu/command_buffer/client/gles2_lib.h" |
| 9 #include "gpu/command_buffer/service/command_buffer_service.h" |
| 10 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 11 #include "gpu/command_buffer/service/gpu_scheduler.h" |
| 12 #include "gpu/GLES2/gles2_command_buffer.h" |
| 13 #include "gpu/gles2_conform_support/egl/config.h" |
| 14 #include "gpu/gles2_conform_support/egl/surface.h" |
| 15 |
| 16 namespace { |
| 17 const int32 kCommandBufferSize = 1024 * 1024; |
| 18 const int32 kTransferBufferSize = 512 * 1024; |
| 19 } |
| 20 |
| 21 namespace egl { |
| 22 |
| 23 Display::Display(EGLNativeDisplayType display_id) |
| 24 : display_id_(display_id), |
| 25 is_initialized_(false), |
| 26 transfer_buffer_id_(-1) { |
| 27 } |
| 28 |
| 29 Display::~Display() { |
| 30 gles2::Terminate(); |
| 31 } |
| 32 |
| 33 bool Display::Initialize() { |
| 34 using gpu::CommandBufferService; |
| 35 scoped_ptr<CommandBufferService> command_buffer(new CommandBufferService); |
| 36 if (!command_buffer->Initialize(kCommandBufferSize)) |
| 37 return false; |
| 38 |
| 39 using gpu::Buffer; |
| 40 int32 transfer_buffer_id = |
| 41 command_buffer->CreateTransferBuffer(kTransferBufferSize, -1); |
| 42 Buffer transfer_buffer = |
| 43 command_buffer->GetTransferBuffer(transfer_buffer_id); |
| 44 if (transfer_buffer.ptr == NULL) |
| 45 return false; |
| 46 |
| 47 using gpu::gles2::GLES2CmdHelper; |
| 48 scoped_ptr<GLES2CmdHelper> cmd_helper( |
| 49 new GLES2CmdHelper(command_buffer.get())); |
| 50 if (!cmd_helper->Initialize(kCommandBufferSize)) |
| 51 return false; |
| 52 |
| 53 gles2::Initialize(); |
| 54 |
| 55 is_initialized_ = true; |
| 56 command_buffer_.reset(command_buffer.release()); |
| 57 transfer_buffer_id_ = transfer_buffer_id; |
| 58 gles2_cmd_helper_.reset(cmd_helper.release()); |
| 59 return true; |
| 60 } |
| 61 |
| 62 bool Display::IsValidConfig(EGLConfig config) { |
| 63 return (config != NULL) && (config == config_.get()); |
| 64 } |
| 65 |
| 66 bool Display::GetConfigs(EGLConfig* configs, |
| 67 EGLint config_size, |
| 68 EGLint* num_config) { |
| 69 // TODO(alokp): Find out a way to find all configs. CommandBuffer currently |
| 70 // does not support finding or choosing configs. |
| 71 *num_config = 1; |
| 72 if (configs != NULL) { |
| 73 if (config_ == NULL) { |
| 74 config_.reset(new Config); |
| 75 } |
| 76 configs[0] = config_.get(); |
| 77 } |
| 78 return true; |
| 79 } |
| 80 |
| 81 bool Display::GetConfigAttrib(EGLConfig config, |
| 82 EGLint attribute, |
| 83 EGLint* value) { |
| 84 const egl::Config* cfg = static_cast<egl::Config*>(config); |
| 85 return cfg->GetAttrib(attribute, value); |
| 86 } |
| 87 |
| 88 bool Display::IsValidNativeWindow(EGLNativeWindowType win) { |
| 89 #if defined OS_WIN |
| 90 return ::IsWindow(win) != FALSE; |
| 91 #else |
| 92 // TODO(alokp): Validate window handle. |
| 93 return true; |
| 94 #endif // OS_WIN |
| 95 } |
| 96 |
| 97 bool Display::IsValidSurface(EGLSurface surface) { |
| 98 return (surface != NULL) && (surface == surface_.get()); |
| 99 } |
| 100 |
| 101 EGLSurface Display::CreateWindowSurface(EGLConfig config, |
| 102 EGLNativeWindowType win, |
| 103 const EGLint* attrib_list) { |
| 104 if (surface_ != NULL) { |
| 105 // We do not support more than one window surface. |
| 106 return EGL_NO_SURFACE; |
| 107 } |
| 108 |
| 109 using gpu::GpuScheduler; |
| 110 std::vector<int32> attribs; |
| 111 scoped_ptr<GpuScheduler> gpu_scheduler( |
| 112 new GpuScheduler(command_buffer_.get(), NULL)); |
| 113 if (!gpu_scheduler->Initialize( |
| 114 win, gfx::Size(), gpu::gles2::DisallowedExtensions(), NULL, |
| 115 attribs, NULL, 0)) |
| 116 return EGL_NO_SURFACE; |
| 117 |
| 118 command_buffer_->SetPutOffsetChangeCallback( |
| 119 NewCallback(gpu_scheduler.get(), &GpuScheduler::PutChanged)); |
| 120 gpu_scheduler_.reset(gpu_scheduler.release()); |
| 121 surface_.reset(new Surface(win)); |
| 122 |
| 123 return surface_.get(); |
| 124 } |
| 125 |
| 126 void Display::DestroySurface(EGLSurface surface) { |
| 127 DCHECK(IsValidSurface(surface)); |
| 128 gpu_scheduler_.reset(); |
| 129 surface_.reset(); |
| 130 } |
| 131 |
| 132 void Display::SwapBuffers(EGLSurface surface) { |
| 133 DCHECK(IsValidSurface(surface)); |
| 134 context_->SwapBuffers(); |
| 135 } |
| 136 |
| 137 bool Display::IsValidContext(EGLContext ctx) { |
| 138 return (ctx != NULL) && (ctx == context_.get()); |
| 139 } |
| 140 |
| 141 EGLContext Display::CreateContext(EGLConfig config, |
| 142 EGLContext share_ctx, |
| 143 const EGLint* attrib_list) { |
| 144 DCHECK(IsValidConfig(config)); |
| 145 // TODO(alokp): Command buffer does not support shared contexts. |
| 146 if (share_ctx != NULL) |
| 147 return EGL_NO_CONTEXT; |
| 148 |
| 149 DCHECK(command_buffer_ != NULL); |
| 150 DCHECK(transfer_buffer_id_ != -1); |
| 151 gpu::Buffer buffer = command_buffer_->GetTransferBuffer(transfer_buffer_id_); |
| 152 DCHECK(buffer.ptr != NULL); |
| 153 bool share_resources = share_ctx != NULL; |
| 154 using gpu::gles2::GLES2Implementation; |
| 155 context_.reset(new GLES2Implementation( |
| 156 gles2_cmd_helper_.get(), |
| 157 buffer.size, |
| 158 buffer.ptr, |
| 159 transfer_buffer_id_, |
| 160 share_resources)); |
| 161 |
| 162 context_->CommandBufferEnableCHROMIUM( |
| 163 PEPPER3D_ALLOW_BUFFERS_ON_MULTIPLE_TARGETS); |
| 164 context_->CommandBufferEnableCHROMIUM( |
| 165 PEPPER3D_SUPPORT_FIXED_ATTRIBS); |
| 166 |
| 167 return context_.get(); |
| 168 } |
| 169 |
| 170 void Display::DestroyContext(EGLContext ctx) { |
| 171 DCHECK(IsValidContext(ctx)); |
| 172 context_.reset(); |
| 173 } |
| 174 |
| 175 bool Display::MakeCurrent(EGLSurface draw, EGLSurface read, EGLContext ctx) { |
| 176 if (ctx == EGL_NO_CONTEXT) { |
| 177 gles2::SetGLContext(NULL); |
| 178 } else { |
| 179 DCHECK(IsValidSurface(draw)); |
| 180 DCHECK(IsValidSurface(read)); |
| 181 DCHECK(IsValidContext(ctx)); |
| 182 gles2::SetGLContext(context_.get()); |
| 183 } |
| 184 return true; |
| 185 } |
| 186 |
| 187 } // namespace egl |
OLD | NEW |