blob: dd7b21b3e9081c4334a370280f623e137a11d87a [file] [log] [blame]
// Copyright 2016 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.
#ifndef GPU_COMMAND_BUFFER_SERVICE_GL_STREAM_TEXTURE_IMAGE_H_
#define GPU_COMMAND_BUFFER_SERVICE_GL_STREAM_TEXTURE_IMAGE_H_
#include "gpu/gpu_gles2_export.h"
#include "ui/gfx/gpu_fence.h"
#include "ui/gl/gl_image.h"
namespace gpu {
namespace gles2 {
// Specialization of GLImage that allows us to support (stream) textures
// that supply a texture matrix.
class GPU_GLES2_EXPORT GLStreamTextureImage : public gl::GLImage {
public:
// Get the matrix.
// Copy the texture matrix for this image into |matrix|.
// Subclasses must return a matrix appropriate for a coordinate system where
// UV=(0,0) corresponds to the top left corner of the image.
virtual void GetTextureMatrix(float matrix[16]) = 0;
virtual void NotifyPromotionHint(bool promotion_hint,
int display_x,
int display_y,
int display_width,
int display_height) = 0;
protected:
~GLStreamTextureImage() override = default;
// Convenience function for subclasses that deal with SurfaceTextures, whose
// coordinate system has (0,0) at the bottom left of the image.
// [ a e i m ] [ 1 0 0 0 ] [ a -e i m+e ]
// [ b f j n ] [ 0 -1 0 1 ] = [ b -f j n+f ]
// [ c g k o ] [ 0 0 1 0 ] [ c -g k o+g ]
// [ d h l p ] [ 0 0 0 1 ] [ d -h l p+h ]
static void YInvertMatrix(float matrix[16]) {
for (int i = 0; i < 4; ++i) {
matrix[i + 12] += matrix[i + 4];
matrix[i + 4] = -matrix[i + 4];
}
}
};
} // namespace gles2
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_SERVICE_GL_STREAM_TEXTURE_IMAGE_H_