15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_bindings.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_context.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_surface_osmesa.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/gl/scoped_make_current.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLSurfaceOSMesa::GLSurfaceOSMesa(unsigned format, const gfx::Size& size) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : format_(format), 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_(size) { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLSurfaceOSMesa::Initialize() { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Resize(size_); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLSurfaceOSMesa::Destroy() { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_.reset(); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLSurfaceOSMesa::Resize(const gfx::Size& new_size) { 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<ui::ScopedMakeCurrent> scoped_make_current; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLContext* current_context = GLContext::GetCurrent(); 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool was_current = 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) current_context && current_context->IsCurrent(this); 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (was_current) { 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_make_current.reset( 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new ui::ScopedMakeCurrent(current_context, this)); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_context->ReleaseCurrent(this); 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Preserve the old buffer. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<int32[]> old_buffer(buffer_.release()); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allocate a new one. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_.reset(new int32[new_size.GetArea()]); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(buffer_.get(), 0, new_size.GetArea() * sizeof(buffer_[0])); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy the old back buffer into the new buffer. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old_buffer.get()) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int copy_width = std::min(size_.width(), new_size.width()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int copy_height = std::min(size_.height(), new_size.height()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 0; y < copy_height; ++y) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int x = 0; x < copy_width; ++x) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_[y * new_size.width() + x] = old_buffer[y * size_.width() + x]; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_ = new_size; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLSurfaceOSMesa::IsOffscreen() { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLSurfaceOSMesa::SwapBuffers() { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Should not call SwapBuffers on an GLSurfaceOSMesa."; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size GLSurfaceOSMesa::GetSize() { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return size_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* GLSurfaceOSMesa::GetHandle() { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buffer_.get(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned GLSurfaceOSMesa::GetFormat() { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return format_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLSurfaceOSMesa::~GLSurfaceOSMesa() { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Destroy(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gfx 86