// Copyright 2017 The NXT Authors // // 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 BACKEND_COMMON_DEVICEBASE_H_ #define BACKEND_COMMON_DEVICEBASE_H_ #include "common/Forward.h" #include "common/RefCounted.h" #include "nxt/nxtcpp.h" namespace backend { using ErrorCallback = void (*)(const char* errorMessage, void* userData); class DeviceBase { public: DeviceBase(); ~DeviceBase(); void HandleError(const char* message); // Used by autogenerated code, returns itself DeviceBase* GetDevice(); virtual BindGroupBase* CreateBindGroup(BindGroupBuilder* builder) = 0; virtual BindGroupLayoutBase* CreateBindGroupLayout(BindGroupLayoutBuilder* builder) = 0; virtual BufferBase* CreateBuffer(BufferBuilder* builder) = 0; virtual BufferViewBase* CreateBufferView(BufferViewBuilder* builder) = 0; virtual CommandBufferBase* CreateCommandBuffer(CommandBufferBuilder* builder) = 0; virtual DepthStencilStateBase* CreateDepthStencilState(DepthStencilStateBuilder* builder) = 0; virtual FramebufferBase* CreateFramebuffer(FramebufferBuilder* builder) = 0; virtual InputStateBase* CreateInputState(InputStateBuilder* builder) = 0; virtual PipelineBase* CreatePipeline(PipelineBuilder* builder) = 0; virtual PipelineLayoutBase* CreatePipelineLayout(PipelineLayoutBuilder* builder) = 0; virtual QueueBase* CreateQueue(QueueBuilder* builder) = 0; virtual RenderPassBase* CreateRenderPass(RenderPassBuilder* builder) = 0; virtual SamplerBase* CreateSampler(SamplerBuilder* builder) = 0; virtual ShaderModuleBase* CreateShaderModule(ShaderModuleBuilder* builder) = 0; virtual TextureBase* CreateTexture(TextureBuilder* builder) = 0; virtual TextureViewBase* CreateTextureView(TextureViewBuilder* builder) = 0; virtual void TickImpl() = 0; // Many NXT objects are completely immutable once created which means that if two // builders are given the same arguments, they can return the same object. Reusing // objects will help make comparisons between objects by a single pointer comparison. // // Technically no object is immutable as they have a reference count, and an // application with reference-counting issues could "see" that objects are reused. // This is solved by automatic-reference counting, and also the fact that when using // the client-server wire every creation will get a different proxy object, with a // different reference count. // // When trying to create an object, we give both the builder and an example of what // the built object will be, the "blueprint". The blueprint is just a FooBase object // instead of a backend Foo object. If the blueprint doesn't match an object in the // cache, then the builder is used to make a new object. BindGroupLayoutBase* GetOrCreateBindGroupLayout(const BindGroupLayoutBase* blueprint, BindGroupLayoutBuilder* builder); void UncacheBindGroupLayout(BindGroupLayoutBase* obj); // NXT API BindGroupBuilder* CreateBindGroupBuilder(); BindGroupLayoutBuilder* CreateBindGroupLayoutBuilder(); BufferBuilder* CreateBufferBuilder(); BufferViewBuilder* CreateBufferViewBuilder(); CommandBufferBuilder* CreateCommandBufferBuilder(); DepthStencilStateBuilder* CreateDepthStencilStateBuilder(); FramebufferBuilder* CreateFramebufferBuilder(); InputStateBuilder* CreateInputStateBuilder(); PipelineBuilder* CreatePipelineBuilder(); PipelineLayoutBuilder* CreatePipelineLayoutBuilder(); QueueBuilder* CreateQueueBuilder(); RenderPassBuilder* CreateRenderPassBuilder(); SamplerBuilder* CreateSamplerBuilder(); ShaderModuleBuilder* CreateShaderModuleBuilder(); TextureBuilder* CreateTextureBuilder(); void Tick(); void CopyBindGroups(uint32_t start, uint32_t count, BindGroupBase* source, BindGroupBase* target); void SetErrorCallback(nxt::DeviceErrorCallback callback, nxt::CallbackUserdata userdata); private: // The object caches aren't exposed in the header as they would require a lot of // additional includes. struct Caches; Caches* caches = nullptr; nxt::DeviceErrorCallback errorCallback = nullptr; nxt::CallbackUserdata errorUserdata = 0; }; } #endif // BACKEND_COMMON_DEVICEBASE_H_