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 // Device loss 150 gl::GraphicsResetStatus getResetStatus() override; 151 152 // Vendor and description strings. 153 std::string getVendorString() const override; 154 std::string getRendererDescription() const override; 155 156 // EXT_debug_marker 157 angle::Result insertEventMarker(GLsizei length, const char *marker) override; 158 angle::Result pushGroupMarker(GLsizei length, const char *marker) override; 159 angle::Result popGroupMarker() override; 160 161 // KHR_debug 162 angle::Result pushDebugGroup(const gl::Context *context, 163 GLenum source, 164 GLuint id, 165 const std::string &message) override; 166 angle::Result popDebugGroup(const gl::Context *context) override; 167 168 // State sync with dirty bits. 169 angle::Result syncState(const gl::Context *context, 170 const gl::State::DirtyBits &dirtyBits, 171 const gl::State::DirtyBits &bitMask) override; 172 173 // Disjoint timer queries 174 GLint getGPUDisjoint() override; 175 GLint64 getTimestamp() override; 176 177 // Context switching 178 angle::Result onMakeCurrent(const gl::Context *context) override; 179 180 // Caps queries 181 gl::Caps getNativeCaps() const override; 182 const gl::TextureCapsMap &getNativeTextureCaps() const override; 183 const gl::Extensions &getNativeExtensions() const override; 184 const gl::Limitations &getNativeLimitations() const override; 185 186 angle::Result dispatchCompute(const gl::Context *context, 187 GLuint numGroupsX, 188 GLuint numGroupsY, 189 GLuint numGroupsZ) override; 190 angle::Result dispatchComputeIndirect(const gl::Context *context, GLintptr indirect) override; 191 192 angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) override; 193 angle::Result memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers) override; 194 getRenderer()195 Renderer9 *getRenderer() const { return mRenderer; } 196 197 angle::Result getIncompleteTexture(const gl::Context *context, 198 gl::TextureType type, 199 gl::Texture **textureOut); 200 201 void handleResult(HRESULT hr, 202 const char *message, 203 const char *file, 204 const char *function, 205 unsigned int line) override; 206 207 private: 208 Renderer9 *mRenderer; 209 IncompleteTextureSet mIncompleteTextures; 210 std::stack<std::string> mMarkerStack; 211 }; 212 213 } // namespace rx 214 215 #endif // LIBANGLE_RENDERER_D3D_D3D9_CONTEXT9_H_ 216