xref: /aosp_15_r20/external/deqp/executor/xeCallQueue.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _XECALLQUEUE_HPP
2*35238bceSAndroid Build Coastguard Worker #define _XECALLQUEUE_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program Test Executor
5*35238bceSAndroid Build Coastguard Worker  * ------------------------------------------
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker  *
9*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker  *
15*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker  *
21*35238bceSAndroid Build Coastguard Worker  *//*!
22*35238bceSAndroid Build Coastguard Worker  * \file
23*35238bceSAndroid Build Coastguard Worker  * \brief Cross-thread function call dispatcher.
24*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "xeDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deMutex.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deSemaphore.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "deRingBuffer.hpp"
30*35238bceSAndroid Build Coastguard Worker 
31*35238bceSAndroid Build Coastguard Worker #include <vector>
32*35238bceSAndroid Build Coastguard Worker 
33*35238bceSAndroid Build Coastguard Worker namespace xe
34*35238bceSAndroid Build Coastguard Worker {
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker class Call;
37*35238bceSAndroid Build Coastguard Worker class CallReader;
38*35238bceSAndroid Build Coastguard Worker class CallWriter;
39*35238bceSAndroid Build Coastguard Worker class CallQueue;
40*35238bceSAndroid Build Coastguard Worker 
41*35238bceSAndroid Build Coastguard Worker // \todo [2012-07-10 pyry] Optimize memory management in Call
42*35238bceSAndroid Build Coastguard Worker // \todo [2012-07-10 pyry] CallQueue API could be improved to match TestLog API more closely.
43*35238bceSAndroid Build Coastguard Worker //                           In order to do that, reference counting system for call object management is needed.
44*35238bceSAndroid Build Coastguard Worker 
45*35238bceSAndroid Build Coastguard Worker class Call
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker public:
48*35238bceSAndroid Build Coastguard Worker     typedef void (*Function)(CallReader &data);
49*35238bceSAndroid Build Coastguard Worker 
50*35238bceSAndroid Build Coastguard Worker     Call(void);
51*35238bceSAndroid Build Coastguard Worker     ~Call(void);
52*35238bceSAndroid Build Coastguard Worker 
53*35238bceSAndroid Build Coastguard Worker     void clear(void);
54*35238bceSAndroid Build Coastguard Worker 
getFunction(void) const55*35238bceSAndroid Build Coastguard Worker     Function getFunction(void) const
56*35238bceSAndroid Build Coastguard Worker     {
57*35238bceSAndroid Build Coastguard Worker         return m_func;
58*35238bceSAndroid Build Coastguard Worker     }
setFunction(Function func)59*35238bceSAndroid Build Coastguard Worker     void setFunction(Function func)
60*35238bceSAndroid Build Coastguard Worker     {
61*35238bceSAndroid Build Coastguard Worker         m_func = func;
62*35238bceSAndroid Build Coastguard Worker     }
63*35238bceSAndroid Build Coastguard Worker 
getDataSize(void) const64*35238bceSAndroid Build Coastguard Worker     size_t getDataSize(void) const
65*35238bceSAndroid Build Coastguard Worker     {
66*35238bceSAndroid Build Coastguard Worker         return m_data.size();
67*35238bceSAndroid Build Coastguard Worker     }
setDataSize(size_t size)68*35238bceSAndroid Build Coastguard Worker     void setDataSize(size_t size)
69*35238bceSAndroid Build Coastguard Worker     {
70*35238bceSAndroid Build Coastguard Worker         m_data.resize(size);
71*35238bceSAndroid Build Coastguard Worker     }
72*35238bceSAndroid Build Coastguard Worker 
getData(void) const73*35238bceSAndroid Build Coastguard Worker     const uint8_t *getData(void) const
74*35238bceSAndroid Build Coastguard Worker     {
75*35238bceSAndroid Build Coastguard Worker         return m_data.empty() ? DE_NULL : &m_data[0];
76*35238bceSAndroid Build Coastguard Worker     }
getData(void)77*35238bceSAndroid Build Coastguard Worker     uint8_t *getData(void)
78*35238bceSAndroid Build Coastguard Worker     {
79*35238bceSAndroid Build Coastguard Worker         return m_data.empty() ? DE_NULL : &m_data[0];
80*35238bceSAndroid Build Coastguard Worker     }
81*35238bceSAndroid Build Coastguard Worker 
82*35238bceSAndroid Build Coastguard Worker private:
83*35238bceSAndroid Build Coastguard Worker     Function m_func;
84*35238bceSAndroid Build Coastguard Worker     std::vector<uint8_t> m_data;
85*35238bceSAndroid Build Coastguard Worker };
86*35238bceSAndroid Build Coastguard Worker 
87*35238bceSAndroid Build Coastguard Worker class CallReader
88*35238bceSAndroid Build Coastguard Worker {
89*35238bceSAndroid Build Coastguard Worker public:
90*35238bceSAndroid Build Coastguard Worker     CallReader(Call *call);
CallReader(void)91*35238bceSAndroid Build Coastguard Worker     CallReader(void) : m_call(DE_NULL), m_curPos(0)
92*35238bceSAndroid Build Coastguard Worker     {
93*35238bceSAndroid Build Coastguard Worker     }
94*35238bceSAndroid Build Coastguard Worker 
95*35238bceSAndroid Build Coastguard Worker     void read(uint8_t *bytes, size_t numBytes);
96*35238bceSAndroid Build Coastguard Worker     const uint8_t *getDataBlock(size_t numBytes); //!< \note Valid only during call.
97*35238bceSAndroid Build Coastguard Worker     bool isDataConsumed(void) const;              //!< all data has been consumed
98*35238bceSAndroid Build Coastguard Worker 
99*35238bceSAndroid Build Coastguard Worker private:
100*35238bceSAndroid Build Coastguard Worker     CallReader(const CallReader &other);            //!< disallowed
101*35238bceSAndroid Build Coastguard Worker     CallReader &operator=(const CallReader &other); //!< disallowed
102*35238bceSAndroid Build Coastguard Worker 
103*35238bceSAndroid Build Coastguard Worker     Call *m_call;
104*35238bceSAndroid Build Coastguard Worker     size_t m_curPos;
105*35238bceSAndroid Build Coastguard Worker };
106*35238bceSAndroid Build Coastguard Worker 
107*35238bceSAndroid Build Coastguard Worker class CallWriter
108*35238bceSAndroid Build Coastguard Worker {
109*35238bceSAndroid Build Coastguard Worker public:
110*35238bceSAndroid Build Coastguard Worker     CallWriter(CallQueue *queue, Call::Function function);
111*35238bceSAndroid Build Coastguard Worker     ~CallWriter(void);
112*35238bceSAndroid Build Coastguard Worker 
113*35238bceSAndroid Build Coastguard Worker     void write(const uint8_t *bytes, size_t numBytes);
114*35238bceSAndroid Build Coastguard Worker     void enqueue(void);
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker private:
117*35238bceSAndroid Build Coastguard Worker     CallWriter(const CallWriter &other);
118*35238bceSAndroid Build Coastguard Worker     CallWriter &operator=(const CallWriter &other);
119*35238bceSAndroid Build Coastguard Worker 
120*35238bceSAndroid Build Coastguard Worker     CallQueue *m_queue;
121*35238bceSAndroid Build Coastguard Worker     Call *m_call;
122*35238bceSAndroid Build Coastguard Worker     bool m_enqueued;
123*35238bceSAndroid Build Coastguard Worker };
124*35238bceSAndroid Build Coastguard Worker 
125*35238bceSAndroid Build Coastguard Worker class CallQueue
126*35238bceSAndroid Build Coastguard Worker {
127*35238bceSAndroid Build Coastguard Worker public:
128*35238bceSAndroid Build Coastguard Worker     CallQueue(void);
129*35238bceSAndroid Build Coastguard Worker     ~CallQueue(void);
130*35238bceSAndroid Build Coastguard Worker 
131*35238bceSAndroid Build Coastguard Worker     void callNext(void); //!< Executes and removes first call in queue. Will block if queue is empty.
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker     Call *getEmptyCall(void);
134*35238bceSAndroid Build Coastguard Worker     void enqueue(Call *call);
135*35238bceSAndroid Build Coastguard Worker     void freeCall(Call *call);
136*35238bceSAndroid Build Coastguard Worker     void cancel(void);
137*35238bceSAndroid Build Coastguard Worker 
138*35238bceSAndroid Build Coastguard Worker private:
139*35238bceSAndroid Build Coastguard Worker     CallQueue(const CallQueue &other);
140*35238bceSAndroid Build Coastguard Worker     CallQueue &operator=(const CallQueue &other);
141*35238bceSAndroid Build Coastguard Worker 
142*35238bceSAndroid Build Coastguard Worker     bool m_canceled;
143*35238bceSAndroid Build Coastguard Worker     de::Semaphore m_callSem;
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker     de::Mutex m_lock;
146*35238bceSAndroid Build Coastguard Worker     std::vector<Call *> m_calls;
147*35238bceSAndroid Build Coastguard Worker     std::vector<Call *> m_freeCalls;
148*35238bceSAndroid Build Coastguard Worker     de::RingBuffer<Call *> m_callQueue;
149*35238bceSAndroid Build Coastguard Worker };
150*35238bceSAndroid Build Coastguard Worker 
151*35238bceSAndroid Build Coastguard Worker // Stream operators for call reader / writer.
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker CallReader &operator>>(CallReader &reader, std::string &value);
154*35238bceSAndroid Build Coastguard Worker CallWriter &operator<<(CallWriter &writer, const char *str);
155*35238bceSAndroid Build Coastguard Worker 
156*35238bceSAndroid Build Coastguard Worker template <typename T>
operator >>(CallReader & reader,T & value)157*35238bceSAndroid Build Coastguard Worker CallReader &operator>>(CallReader &reader, T &value)
158*35238bceSAndroid Build Coastguard Worker {
159*35238bceSAndroid Build Coastguard Worker     reader.read((uint8_t *)&value, sizeof(T));
160*35238bceSAndroid Build Coastguard Worker     return reader;
161*35238bceSAndroid Build Coastguard Worker }
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker template <typename T>
operator <<(CallWriter & writer,T & value)164*35238bceSAndroid Build Coastguard Worker CallWriter &operator<<(CallWriter &writer, T &value)
165*35238bceSAndroid Build Coastguard Worker {
166*35238bceSAndroid Build Coastguard Worker     writer.write((const uint8_t *)&value, sizeof(T));
167*35238bceSAndroid Build Coastguard Worker     return writer;
168*35238bceSAndroid Build Coastguard Worker }
169*35238bceSAndroid Build Coastguard Worker 
170*35238bceSAndroid Build Coastguard Worker } // namespace xe
171*35238bceSAndroid Build Coastguard Worker 
172*35238bceSAndroid Build Coastguard Worker #endif // _XECALLQUEUE_HPP
173