Split backend/common in backend/ and common/
This directory used to contain both the state tracking code for the
backends, and the common utilities that could be used both by the
backends and the rest of the code. Things are now:
- src/common is utility code for the whole repo
- src/backend contains libNXT's code
- src/utils is utility code that we don't want in libNXT
This commit also changes all includes to use global paths from src/
bacause it had to touch a bunch of #include statements anyway.
diff --git a/src/backend/CommandBufferStateTracker.h b/src/backend/CommandBufferStateTracker.h
new file mode 100644
index 0000000..290596e
--- /dev/null
+++ b/src/backend/CommandBufferStateTracker.h
@@ -0,0 +1,104 @@
+// 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_COMMANDBUFFERSTATETRACKER_H
+#define BACKEND_COMMANDBUFFERSTATETRACKER_H
+
+#include "backend/CommandBuffer.h"
+#include "common/Constants.h"
+
+#include <bitset>
+#include <map>
+#include <set>
+
+namespace backend {
+ class CommandBufferStateTracker {
+ public:
+ explicit CommandBufferStateTracker(CommandBufferBuilder* builder);
+
+ // Non-state-modifying validation functions
+ bool HaveRenderPass() const;
+ bool ValidateCanCopy() const;
+ bool ValidateCanUseBufferAs(BufferBase* buffer, nxt::BufferUsageBit usage) const;
+ bool ValidateCanUseTextureAs(TextureBase* texture, nxt::TextureUsageBit usage) const;
+ bool ValidateCanDispatch();
+ bool ValidateCanDrawArrays();
+ bool ValidateCanDrawElements();
+ bool ValidateEndCommandBuffer() const;
+
+ // State-modifying methods
+ bool BeginSubpass();
+ bool EndSubpass();
+ bool BeginRenderPass(RenderPassBase* renderPass, FramebufferBase* framebuffer);
+ bool AdvanceSubpass();
+ bool EndRenderPass();
+ bool SetPipeline(PipelineBase* pipeline);
+ bool SetBindGroup(uint32_t index, BindGroupBase* bindgroup);
+ bool SetIndexBuffer(BufferBase* buffer);
+ bool SetVertexBuffer(uint32_t index, BufferBase* buffer);
+ bool TransitionBufferUsage(BufferBase* buffer, nxt::BufferUsageBit usage);
+ bool TransitionTextureUsage(TextureBase* texture, nxt::TextureUsageBit usage);
+
+ // These collections are copied to the CommandBuffer at build time.
+ // These pointers will remain valid since they are referenced by
+ // the bind groups which are referenced by this command buffer.
+ std::set<BufferBase*> buffersTransitioned;
+ std::set<TextureBase*> texturesTransitioned;
+
+ private:
+ enum ValidationAspect {
+ VALIDATION_ASPECT_RENDER_PIPELINE,
+ VALIDATION_ASPECT_COMPUTE_PIPELINE,
+ VALIDATION_ASPECT_BIND_GROUPS,
+ VALIDATION_ASPECT_VERTEX_BUFFERS,
+ VALIDATION_ASPECT_INDEX_BUFFER,
+
+ VALIDATION_ASPECT_COUNT
+ };
+ using ValidationAspects = std::bitset<VALIDATION_ASPECT_COUNT>;
+
+ // Usage helper functions
+ bool BufferHasGuaranteedUsageBit(BufferBase* buffer, nxt::BufferUsageBit usage) const;
+ bool TextureHasGuaranteedUsageBit(TextureBase* texture, nxt::TextureUsageBit usage) const;
+ bool IsTextureTransitionPossible(TextureBase* texture, nxt::TextureUsageBit usage) const;
+
+ // Queries for lazily evaluated aspects
+ bool RecomputeHaveAspectBindGroups();
+ bool RecomputeHaveAspectVertexBuffers();
+
+ bool HavePipeline() const;
+ bool ValidateBindGroupUsages(BindGroupBase* group) const;
+ bool RevalidateCanDraw();
+
+ void UnsetPipeline();
+
+ CommandBufferBuilder* builder;
+
+ ValidationAspects aspects;
+
+ std::bitset<kMaxBindGroups> bindgroupsSet;
+ std::bitset<kMaxVertexInputs> inputsSet;
+ PipelineBase* lastPipeline = nullptr;
+
+ std::map<BufferBase*, nxt::BufferUsageBit> mostRecentBufferUsages;
+ std::map<TextureBase*, nxt::TextureUsageBit> mostRecentTextureUsages;
+
+ RenderPassBase* currentRenderPass = nullptr;
+ FramebufferBase* currentFramebuffer = nullptr;
+ bool subpassActive = false;
+ uint32_t currentSubpass = 0;
+ };
+}
+
+#endif // BACKEND_COMMANDBUFFERSTATETRACKER_H