• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // Context9:
7 //   D3D9-specific functionality associated with a GL Context.
8 //
9 
10 #ifndef LIBANGLE_RENDERER_D3D_D3D9_CONTEXT9_H_
11 #define LIBANGLE_RENDERER_D3D_D3D9_CONTEXT9_H_
12 
13 #include <stack>
14 #include "libANGLE/renderer/d3d/ContextD3D.h"
15 
16 namespace rx
17 {
18 class Renderer9;
19 
20 class Context9 : public ContextD3D
21 {
22   public:
23     Context9(const gl::State &state, gl::ErrorSet *errorSet, Renderer9 *renderer);
24     ~Context9() override;
25 
26     angle::Result initialize() override;
27     void onDestroy(const gl::Context *context) override;
28 
29     // Shader creation
30     CompilerImpl *createCompiler() override;
31     ShaderImpl *createShader(const gl::ShaderState &data) override;
32     ProgramImpl *createProgram(const gl::ProgramState &data) override;
33 
34     // Framebuffer creation
35     FramebufferImpl *createFramebuffer(const gl::FramebufferState &data) override;
36 
37     // Texture creation
38     TextureImpl *createTexture(const gl::TextureState &state) override;
39 
40     // Renderbuffer creation
41     RenderbufferImpl *createRenderbuffer(const gl::RenderbufferState &state) override;
42 
43     // Buffer creation
44     BufferImpl *createBuffer(const gl::BufferState &state) override;
45 
46     // Vertex Array creation
47     VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override;
48 
49     // Query and Fence creation
50     QueryImpl *createQuery(gl::QueryType type) override;
51     FenceNVImpl *createFenceNV() override;
52     SyncImpl *createSync() override;
53 
54     // Transform Feedback creation
55     TransformFeedbackImpl *createTransformFeedback(
56         const gl::TransformFeedbackState &state) override;
57 
58     // Sampler object creation
59     SamplerImpl *createSampler(const gl::SamplerState &state) override;
60 
61     // Program Pipeline object creation
62     ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) override;
63 
64     // Memory object creation.
65     MemoryObjectImpl *createMemoryObject() override;
66 
67     // Semaphore creation.
68     SemaphoreImpl *createSemaphore() override;
69 
70     // Overlay creation.
71     OverlayImpl *createOverlay(const gl::OverlayState &state) override;
72 
73     // Flush and finish.
74     angle::Result flush(const gl::Context *context) override;
75     angle::Result finish(const gl::Context *context) override;
76 
77     // Drawing methods.
78     angle::Result drawArrays(const gl::Context *context,
79                              gl::PrimitiveMode mode,
80                              GLint first,
81                              GLsizei count) override;
82     angle::Result drawArraysInstanced(const gl::Context *context,
83                                       gl::PrimitiveMode mode,
84                                       GLint first,
85                                       GLsizei count,
86                                       GLsizei instanceCount) override;
87     angle::Result drawArraysInstancedBaseInstance(const gl::Context *context,
88                                                   gl::PrimitiveMode mode,
89                                                   GLint first,
90                                                   GLsizei count,
91                                                   GLsizei instanceCount,
92                                                   GLuint baseInstance) override;
93 
94     angle::Result drawElements(const gl::Context *context,
95                                gl::PrimitiveMode mode,
96                                GLsizei count,
97                                gl::DrawElementsType type,
98                                const void *indices) override;
99     angle::Result drawElementsBaseVertex(const gl::Context *context,
100                                          gl::PrimitiveMode mode,
101                                          GLsizei count,
102                                          gl::DrawElementsType type,
103                                          const void *indices,
104                                          GLint baseVertex) override;
105     angle::Result drawElementsInstanced(const gl::Context *context,
106                                         gl::PrimitiveMode mode,
107                                         GLsizei count,
108                                         gl::DrawElementsType type,
109                                         const void *indices,
110                                         GLsizei instances) override;
111     angle::Result drawElementsInstancedBaseVertex(const gl::Context *context,
112                                                   gl::PrimitiveMode mode,
113                                                   GLsizei count,
114                                                   gl::DrawElementsType type,
115                                                   const void *indices,
116                                                   GLsizei instances,
117                                                   GLint baseVertex) override;
118     angle::Result drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
119                                                               gl::PrimitiveMode mode,
120                                                               GLsizei count,
121                                                               gl::DrawElementsType type,
122                                                               const void *indices,
123                                                               GLsizei instances,
124                                                               GLint baseVertex,
125                                                               GLuint baseInstance) override;
126     angle::Result drawRangeElements(const gl::Context *context,
127                                     gl::PrimitiveMode mode,
128                                     GLuint start,
129                                     GLuint end,
130                                     GLsizei count,
131                                     gl::DrawElementsType type,
132                                     const void *indices) override;
133     angle::Result drawRangeElementsBaseVertex(const gl::Context *context,
134                                               gl::PrimitiveMode mode,
135                                               GLuint start,
136                                               GLuint end,
137                                               GLsizei count,
138                                               gl::DrawElementsType type,
139                                               const void *indices,
140                                               GLint baseVertex) override;
141     angle::Result drawArraysIndirect(const gl::Context *context,
142                                      gl::PrimitiveMode mode,
143                                      const void *indirect) override;
144     angle::Result drawElementsIndirect(const gl::Context *context,
145                                        gl::PrimitiveMode mode,
146                                        gl::DrawElementsType type,
147                                        const void *indirect) override;
148 
149     angle::Result multiDrawArrays(const gl::Context *context,
150                                   gl::PrimitiveMode mode,
151                                   const GLint *firsts,
152                                   const GLsizei *counts,
153                                   GLsizei drawcount) override;
154     angle::Result multiDrawArraysInstanced(const gl::Context *context,
155                                            gl::PrimitiveMode mode,
156                                            const GLint *firsts,
157                                            const GLsizei *counts,
158                                            const GLsizei *instanceCounts,
159                                            GLsizei drawcount) override;
160     angle::Result multiDrawArraysIndirect(const gl::Context *context,
161                                           gl::PrimitiveMode mode,
162                                           const void *indirect,
163                                           GLsizei drawcount,
164                                           GLsizei stride) override;
165     angle::Result multiDrawElements(const gl::Context *context,
166                                     gl::PrimitiveMode mode,
167                                     const GLsizei *counts,
168                                     gl::DrawElementsType type,
169                                     const GLvoid *const *indices,
170                                     GLsizei drawcount) override;
171     angle::Result multiDrawElementsInstanced(const gl::Context *context,
172                                              gl::PrimitiveMode mode,
173                                              const GLsizei *counts,
174                                              gl::DrawElementsType type,
175                                              const GLvoid *const *indices,
176                                              const GLsizei *instanceCounts,
177                                              GLsizei drawcount) override;
178     angle::Result multiDrawElementsIndirect(const gl::Context *context,
179                                             gl::PrimitiveMode mode,
180                                             gl::DrawElementsType type,
181                                             const void *indirect,
182                                             GLsizei drawcount,
183                                             GLsizei stride) override;
184     angle::Result multiDrawArraysInstancedBaseInstance(const gl::Context *context,
185                                                        gl::PrimitiveMode mode,
186                                                        const GLint *firsts,
187                                                        const GLsizei *counts,
188                                                        const GLsizei *instanceCounts,
189                                                        const GLuint *baseInstances,
190                                                        GLsizei drawcount) override;
191     angle::Result multiDrawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
192                                                                    gl::PrimitiveMode mode,
193                                                                    const GLsizei *counts,
194                                                                    gl::DrawElementsType type,
195                                                                    const GLvoid *const *indices,
196                                                                    const GLsizei *instanceCounts,
197                                                                    const GLint *baseVertices,
198                                                                    const GLuint *baseInstances,
199                                                                    GLsizei drawcount) override;
200 
201     // Device loss
202     gl::GraphicsResetStatus getResetStatus() override;
203 
204     // EXT_debug_marker
205     angle::Result insertEventMarker(GLsizei length, const char *marker) override;
206     angle::Result pushGroupMarker(GLsizei length, const char *marker) override;
207     angle::Result popGroupMarker() override;
208 
209     // KHR_debug
210     angle::Result pushDebugGroup(const gl::Context *context,
211                                  GLenum source,
212                                  GLuint id,
213                                  const std::string &message) override;
214     angle::Result popDebugGroup(const gl::Context *context) override;
215 
216     // State sync with dirty bits.
217     angle::Result syncState(const gl::Context *context,
218                             const gl::state::DirtyBits dirtyBits,
219                             const gl::state::DirtyBits bitMask,
220                             const gl::state::ExtendedDirtyBits extendedDirtyBits,
221                             const gl::state::ExtendedDirtyBits extendedBitMask,
222                             gl::Command command) override;
223 
224     // Disjoint timer queries
225     GLint getGPUDisjoint() override;
226     GLint64 getTimestamp() override;
227 
228     // Context switching
229     angle::Result onMakeCurrent(const gl::Context *context) override;
230 
231     // Caps queries
232     gl::Caps getNativeCaps() const override;
233     const gl::TextureCapsMap &getNativeTextureCaps() const override;
234     const gl::Extensions &getNativeExtensions() const override;
235     const gl::Limitations &getNativeLimitations() const override;
236     const ShPixelLocalStorageOptions &getNativePixelLocalStorageOptions() const override;
237 
238     angle::Result dispatchCompute(const gl::Context *context,
239                                   GLuint numGroupsX,
240                                   GLuint numGroupsY,
241                                   GLuint numGroupsZ) override;
242     angle::Result dispatchComputeIndirect(const gl::Context *context, GLintptr indirect) override;
243 
244     angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) override;
245     angle::Result memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers) override;
246 
getRenderer()247     Renderer9 *getRenderer() const { return mRenderer; }
248     angle::ImageLoadContext getImageLoadContext() const;
249 
250     angle::Result getIncompleteTexture(const gl::Context *context,
251                                        gl::TextureType type,
252                                        gl::Texture **textureOut);
253 
254     void handleResult(HRESULT hr,
255                       const char *message,
256                       const char *file,
257                       const char *function,
258                       unsigned int line) override;
259 
260   private:
261     Renderer9 *mRenderer;
262     IncompleteTextureSet mIncompleteTextures;
263     std::stack<std::string> mMarkerStack;
264 };
265 
266 }  // namespace rx
267 
268 #endif  // LIBANGLE_RENDERER_D3D_D3D9_CONTEXT9_H_
269