Hash :
4928b7ca
Author :
Date :
2017-06-20T12:57:39
Proliferate gl::Context everywhere. This gives the D3D back-end access to the GL state almost anywhere. This uses the onDestroy hook for Textures to push errors up from destructors, although they still don't quite make it to the Context. There are places, such as in EGL object (Context/Surface) destruction, where we end up calling through to GL implementation internals without having access to a gl::Context. We handle this via a proxy Context to a Display, basically a null context, that has access to impl-side state like the Renderer pointer if necessary. It does not have access to the normal GL state. Also Pass gl::Context to RefCountObject::release(). Since we're using destroy() methods now, we should not ever call the destructor directly. BUG=angleproject:1156 Change-Id: Ie4c32ad6bf6caaff0289901f30b5c6bafa2ce259 Reviewed-on: https://chromium-review.googlesource.com/529707 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
//
// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Image.h: Defines the egl::Image class representing the EGLimage object.
#ifndef LIBANGLE_IMAGE_H_
#define LIBANGLE_IMAGE_H_
#include "common/angleutils.h"
#include "libANGLE/AttributeMap.h"
#include "libANGLE/Error.h"
#include "libANGLE/FramebufferAttachment.h"
#include "libANGLE/RefCountObject.h"
#include "libANGLE/formatutils.h"
#include <set>
namespace rx
{
class EGLImplFactory;
class ImageImpl;
}
namespace egl
{
class Image;
// Only currently Renderbuffers and Textures can be bound with images. This makes the relationship
// explicit, and also ensures that an image sibling can determine if it's been initialized or not,
// which is important for the robust resource init extension with Textures and EGLImages.
class ImageSibling : public gl::RefCountObject, public gl::FramebufferAttachmentObject
{
public:
ImageSibling(GLuint id);
virtual ~ImageSibling();
protected:
// Set the image target of this sibling
void setTargetImage(const gl::Context *context, egl::Image *imageTarget);
// Orphan all EGL image sources and targets
gl::Error orphanImages(const gl::Context *context);
private:
friend class Image;
// Called from Image only to add a new source image
void addImageSource(egl::Image *imageSource);
// Called from Image only to remove a source image when the Image is being deleted
void removeImageSource(egl::Image *imageSource);
std::set<Image *> mSourcesOf;
gl::BindingPointer<Image> mTargetOf;
};
struct ImageState : private angle::NonCopyable
{
ImageState(EGLenum target, ImageSibling *buffer, const AttributeMap &attribs);
gl::ImageIndex imageIndex;
gl::BindingPointer<ImageSibling> source;
std::set<ImageSibling *> targets;
};
class Image final : public gl::RefCountObject
{
public:
Image(rx::EGLImplFactory *factory,
EGLenum target,
ImageSibling *buffer,
const AttributeMap &attribs);
void onDestroy(const gl::Context *context) override;
~Image();
const gl::Format &getFormat() const;
size_t getWidth() const;
size_t getHeight() const;
size_t getSamples() const;
Error initialize();
rx::ImageImpl *getImplementation() const;
private:
friend class ImageSibling;
// Called from ImageSibling only notify the image that a new target sibling exists for state
// tracking.
void addTargetSibling(ImageSibling *sibling);
// Called from ImageSibling only to notify the image that a sibling (source or target) has
// been respecified and state tracking should be updated.
gl::Error orphanSibling(const gl::Context *context, ImageSibling *sibling);
ImageState mState;
rx::ImageImpl *mImplementation;
};
} // namespace egl
#endif // LIBANGLE_IMAGE_H_