blob: cdf654e7fbdce7800d286cbea61c999537f226d2 [file] [log] [blame]
/*
* Copyright 2023 The Cobalt Authors. All Rights Reserved.
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef GLIMP_GLES_TEXTURE_IMPL_H_
#define GLIMP_GLES_TEXTURE_IMPL_H_
#include "glimp/egl/surface.h"
#include "glimp/gles/buffer.h"
#include "glimp/gles/pixel_format.h"
#include "glimp/gles/shader.h"
#include "glimp/rect.h"
#include "glimp/ref_counted.h"
namespace glimp {
namespace gles {
class TextureImpl {
public:
virtual ~TextureImpl() {}
// Specifies texture parameters necessary to allocate texture data within
// this texture. This method must be called before pixel data can be
// provided to the texture via UpdateData*() methods. If |width| == 0,
// the texture should be placed in an uninitialized state where UpdateData*()
// methods are invalid.
// This method is called when glTexImage2D() is called.
// https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml
virtual void Initialize(int level,
PixelFormat pixel_format,
int width,
int height) = 0;
// Called when glTexImage2D() is called with non-null pixels, or when
// glTexSubImage2D() or glCopyTexSubImage2D() is called. Updates an already
// allocated texture with new texture data provided by the client. The
// parameters of this method define a window within the existing texture
// data of which should be updated with the provided (non-NULL) |pixels|.
// The provided |pitch_in_bytes| refers to the input data pixel rows.
// This function will return true if successful, false if memory allocation
// failed.
// https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml
// https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexSubImage2D.xml
// https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexSubImage2D.xml
virtual bool UpdateData(int level,
const nb::Rect<int>& window,
int pitch_in_bytes,
const void* pixels) = 0;
// Similar to UpdateData() above, however the source of pixels in this case
// is a buffer object, and an offset into it. This method will be called
// when glTexImage2D() or glTexSubImage2D() is called while a buffer is bound
// to the GL_PIXEL_UNPACK_BUFFER target.
// https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexImage2D.xml
// https://www.khronos.org/opengles/sdk/docs/man/xhtml/glTexSubImage2D.xml
virtual void UpdateDataFromBuffer(
int level,
const nb::Rect<int>& window,
int pitch_in_bytes,
const nb::scoped_refptr<Buffer>& pixel_unpack_buffer,
uintptr_t buffer_offset) = 0;
// Called when eglBindTexImage() is called. When this occurs, the texture
// should configure itself to point at the same data as the passed in
// egl::Surface is pointing to, so that the egl::Surface can effectively be
// referenced as a texture. This method should clear out any existing image
// data in the texture when it is called. When eglReleaseTexImage() is
// called, TextureImpl::Initialize() will be called with |width| = 0 to reset
// this texture.
// https://www.khronos.org/registry/egl/sdk/docs/man/html/eglBindTexImage.xhtml
virtual void BindToEGLSurface(egl::Surface* surface) = 0;
// This is called when glReadPixels() is called. The
virtual void ReadPixelsAsRGBA8(const nb::Rect<int>& window,
int pitch_in_bytes,
void* pixels) = 0;
// Returns true if this texture is valid for use as a Framebuffer color
// attachment. In other words, this should return true if the texture can
// be used as a render target. This method is called when the function
// glCheckFramebufferStatus() is called on a framebuffer that has this
// texture attached to it.
// https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCheckFramebufferStatus.xml
virtual bool CanBeAttachedToFramebuffer() const = 0;
private:
};
} // namespace gles
} // namespace glimp
#endif // GLIMP_GLES_TEXTURE_IMPL_H_