blob: 180e45be692454f6e6b95c604028644dc52611b4 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/vr/cpu_surface_provider.h"
#include "cc/paint/skia_paint_canvas.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "third_party/skia/include/gpu/GrContext.h"
#include "third_party/skia/include/gpu/GrContextOptions.h"
#include "third_party/skia/include/gpu/GrTypes.h"
#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
#include "ui/gfx/geometry/size.h"
namespace vr {
CpuSurfaceProvider::CpuSurfaceProvider() = default;
CpuSurfaceProvider::~CpuSurfaceProvider() = default;
sk_sp<SkSurface> CpuSurfaceProvider::MakeSurface(const gfx::Size& size) {
return SkSurface::MakeRasterN32Premul(size.width(), size.height());
}
GLuint CpuSurfaceProvider::FlushSurface(SkSurface* surface,
GLuint reuse_texture_id) {
GLuint texture_id = reuse_texture_id;
if (texture_id == 0) {
glGenTextures(1, &texture_id);
}
cc::SkiaPaintCanvas paint_canvas(surface->getCanvas());
paint_canvas.flush();
SkPixmap pixmap;
CHECK(surface->peekPixels(&pixmap));
SkColorType type = pixmap.colorType();
DCHECK(type == kRGBA_8888_SkColorType || type == kBGRA_8888_SkColorType);
GLint format = (type == kRGBA_8888_SkColorType ? GL_RGBA : GL_BGRA);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, format, pixmap.width(), pixmap.height(), 0,
format, GL_UNSIGNED_BYTE, pixmap.addr());
return texture_id;
}
} // namespace vr