summaryrefslogtreecommitdiff
path: root/stream-servers/RenderThreadInfo.h
blob: ecf4c7d9bdf1b74bf69fbcbb56ebdf4741a196ea (plain)
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
/*
* Copyright (C) 2011 The Android Open Source Project
*
* 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 _LIB_OPENGL_RENDER_THREAD_INFO_H
#define _LIB_OPENGL_RENDER_THREAD_INFO_H

#include <functional>
#include <memory>
#include <unordered_set>

#include "RenderContext.h"
#include "StalePtrRegistry.h"
#include "SyncThread.h"
#include "VkDecoder.h"
#include "WindowSurface.h"
#include "base/Stream.h"
#include "gles1_dec/GLESv1Decoder.h"
#include "gles2_dec/GLESv2Decoder.h"
#include "renderControl_dec/renderControl_dec.h"

typedef uint32_t HandleType;
typedef std::unordered_set<HandleType> ThreadContextSet;
typedef std::unordered_set<HandleType> WindowSurfaceSet;

// A class used to model the state of each RenderThread related
struct RenderThreadInfo {
    // Create new instance. Only call this once per thread.
    // Future callls to get() will return this instance until
    // it is destroyed.
    RenderThreadInfo();

    // Destructor.
    ~RenderThreadInfo();

    // Return the current thread's instance, if any, or NULL.
    static RenderThreadInfo* get();

    // Loop over all active render thread infos
    static void forAllRenderThreadInfos(std::function<void(RenderThreadInfo*)>);

    // Current EGL context, draw surface and read surface.
    HandleType currContextHandleFromLoad;
    HandleType currDrawSurfHandleFromLoad;
    HandleType currReadSurfHandleFromLoad;

    RenderContextPtr currContext;
    WindowSurfacePtr currDrawSurf;
    WindowSurfacePtr currReadSurf;

    // Decoder states.
    GLESv1Decoder                   m_glDec;
    GLESv2Decoder                   m_gl2Dec;
    renderControl_decoder_context_t m_rcDec;
    std::unique_ptr<VkDecoder> m_vkDec;

    // All the contexts that are created by this render thread.
    // New emulator manages contexts in guest process level,
    // m_contextSet should be deprecated. It is only kept for
    // backward compatibility reason.
    ThreadContextSet                m_contextSet;
    // all the window surfaces that are created by this render thread
    WindowSurfaceSet                m_windowSet;

    // The unique id of owner guest process of this render thread
    uint64_t                        m_puid = 0;

    // Functions to save / load a snapshot
    // They must be called after Framebuffer snapshot
    void onSave(android::base::Stream* stream);
    bool onLoad(android::base::Stream* stream);

    // Sometimes we can load render thread info before
    // FrameBuffer repopulates the contexts.
    void postLoadRefreshCurrentContextSurfacePtrs();
};

#endif