Hash :
0d203aef
Author :
Date :
2022-10-16T10:08:01
EGL: Add ID types for egl::Surface and egl::Image. This is in preparation for using resource maps for Context, Surface and EGLImage. The map change will make it much easier to work with the trace fixture. It will also have a small benefit in safety as we will longer be casting raw pointers for these types. As these objects are used in a lot of places, and simplified C can't handle unordered_map, it's necessary to index the maps by simple packed IDs in capture/replay code. Bug: angleproject:7758 Change-Id: Ib1d19622a4f2a6f0458cc28f5bbe30bb9f349b98 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3957163 Reviewed-by: Yuxin Hu <yuxinhu@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Jamie Madill <jmadill@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
//
// Copyright 2014 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.
//
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "libANGLE/AttributeMap.h"
#include "libANGLE/Config.h"
#include "libANGLE/State.h"
#include "libANGLE/Surface.h"
#include "libANGLE/angletypes.h"
#include "libANGLE/renderer/FramebufferImpl_mock.h"
#include "libANGLE/renderer/SurfaceImpl.h"
#include "tests/angle_unittests_utils.h"
using namespace rx;
using namespace testing;
namespace
{
class MockSurfaceImpl : public rx::SurfaceImpl
{
public:
MockSurfaceImpl() : SurfaceImpl(mockState), mockState({1}, nullptr, egl::AttributeMap()) {}
virtual ~MockSurfaceImpl() { destructor(); }
MOCK_METHOD1(destroy, void(const egl::Display *));
MOCK_METHOD1(initialize, egl::Error(const egl::Display *));
MOCK_METHOD1(swap, egl::Error(const gl::Context *));
MOCK_METHOD3(swapWithDamage, egl::Error(const gl::Context *, const EGLint *, EGLint));
MOCK_METHOD5(postSubBuffer, egl::Error(const gl::Context *, EGLint, EGLint, EGLint, EGLint));
MOCK_METHOD2(querySurfacePointerANGLE, egl::Error(EGLint, void **));
MOCK_METHOD3(bindTexImage, egl::Error(const gl::Context *context, gl::Texture *, EGLint));
MOCK_METHOD2(releaseTexImage, egl::Error(const gl::Context *context, EGLint));
MOCK_METHOD3(getSyncValues, egl::Error(EGLuint64KHR *, EGLuint64KHR *, EGLuint64KHR *));
MOCK_METHOD2(getMscRate, egl::Error(EGLint *, EGLint *));
MOCK_METHOD1(setSwapInterval, void(EGLint));
MOCK_CONST_METHOD0(getWidth, EGLint());
MOCK_CONST_METHOD0(getHeight, EGLint());
MOCK_CONST_METHOD0(isPostSubBufferSupported, EGLint(void));
MOCK_CONST_METHOD0(getSwapBehavior, EGLint(void));
MOCK_METHOD5(getAttachmentRenderTarget,
angle::Result(const gl::Context *,
GLenum,
const gl::ImageIndex &,
GLsizei,
rx::FramebufferAttachmentRenderTarget **));
MOCK_METHOD2(attachToFramebuffer, egl::Error(const gl::Context *, gl::Framebuffer *));
MOCK_METHOD2(detachFromFramebuffer, egl::Error(const gl::Context *, gl::Framebuffer *));
MOCK_METHOD0(destructor, void());
egl::SurfaceState mockState;
};
TEST(SurfaceTest, DestructionDeletesImpl)
{
NiceMock<MockEGLFactory> factory;
MockSurfaceImpl *impl = new MockSurfaceImpl;
EXPECT_CALL(factory, createWindowSurface(_, _, _)).WillOnce(Return(impl));
egl::Config config;
egl::Surface *surface = new egl::WindowSurface(
&factory, {1}, &config, static_cast<EGLNativeWindowType>(0), egl::AttributeMap(), false);
EXPECT_CALL(*impl, destroy(_)).Times(1).RetiresOnSaturation();
EXPECT_CALL(*impl, destructor()).Times(1).RetiresOnSaturation();
EXPECT_FALSE(surface->onDestroy(nullptr).isError());
// Only needed because the mock is leaked if bugs are present,
// which logs an error, but does not cause the test to fail.
// Ordinarily mocks are verified when destroyed.
Mock::VerifyAndClear(impl);
}
} // namespace