| // Copyright 2013 The Flutter 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 "flutter/shell/platform/windows/external_texture_pixelbuffer.h" |
| |
| namespace flutter { |
| |
| ExternalTexturePixelBuffer::ExternalTexturePixelBuffer( |
| const FlutterDesktopPixelBufferTextureCallback texture_callback, |
| void* user_data, |
| std::shared_ptr<egl::ProcTable> gl) |
| : texture_callback_(texture_callback), |
| user_data_(user_data), |
| gl_(std::move(gl)) {} |
| |
| ExternalTexturePixelBuffer::~ExternalTexturePixelBuffer() { |
| if (gl_texture_ != 0) { |
| gl_->DeleteTextures(1, &gl_texture_); |
| } |
| } |
| |
| bool ExternalTexturePixelBuffer::PopulateTexture( |
| size_t width, |
| size_t height, |
| FlutterOpenGLTexture* opengl_texture) { |
| if (!CopyPixelBuffer(width, height)) { |
| return false; |
| } |
| |
| // Populate the texture object used by the engine. |
| opengl_texture->target = GL_TEXTURE_2D; |
| opengl_texture->name = gl_texture_; |
| opengl_texture->format = GL_RGBA8_OES; |
| opengl_texture->destruction_callback = nullptr; |
| opengl_texture->user_data = nullptr; |
| opengl_texture->width = width; |
| opengl_texture->height = height; |
| |
| return true; |
| } |
| |
| bool ExternalTexturePixelBuffer::CopyPixelBuffer(size_t& width, |
| size_t& height) { |
| const FlutterDesktopPixelBuffer* pixel_buffer = |
| texture_callback_(width, height, user_data_); |
| if (!pixel_buffer || !pixel_buffer->buffer) { |
| return false; |
| } |
| width = pixel_buffer->width; |
| height = pixel_buffer->height; |
| |
| if (gl_texture_ == 0) { |
| gl_->GenTextures(1, &gl_texture_); |
| |
| gl_->BindTexture(GL_TEXTURE_2D, gl_texture_); |
| gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
| gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
| |
| } else { |
| gl_->BindTexture(GL_TEXTURE_2D, gl_texture_); |
| } |
| gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixel_buffer->width, |
| pixel_buffer->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, |
| pixel_buffer->buffer); |
| if (pixel_buffer->release_callback) { |
| pixel_buffer->release_callback(pixel_buffer->release_context); |
| } |
| return true; |
| } |
| |
| } // namespace flutter |