You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
323 lines
12 KiB
323 lines
12 KiB
/****************************************************************************
|
|
Copyright (c) 2019-2023 Xiamen Yaji Software Co., Ltd.
|
|
|
|
http://www.cocos.com
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights to
|
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
THE SOFTWARE.
|
|
****************************************************************************/
|
|
|
|
#pragma once
|
|
|
|
#include "GLES3GPUObjects.h"
|
|
|
|
namespace cc {
|
|
namespace gfx {
|
|
|
|
class GLES3Device;
|
|
class GLES3QueryPool;
|
|
|
|
class GLES3CmdBeginRenderPass final : public GLESCmd {
|
|
public:
|
|
GLES3GPURenderPass *gpuRenderPass = nullptr;
|
|
GLES3GPUFramebuffer *gpuFBO = nullptr;
|
|
Rect renderArea;
|
|
Color clearColors[MAX_ATTACHMENTS];
|
|
float clearDepth = 1.0F;
|
|
uint32_t clearStencil = 0U;
|
|
uint32_t subpassIdx = 0U;
|
|
|
|
GLES3CmdBeginRenderPass() : GLESCmd(GLESCmdType::BEGIN_RENDER_PASS) {}
|
|
|
|
void clear() override {
|
|
gpuRenderPass = nullptr;
|
|
gpuFBO = nullptr;
|
|
}
|
|
};
|
|
|
|
class GLES3CmdBindStates final : public GLESCmd {
|
|
public:
|
|
GLES3GPUPipelineState *gpuPipelineState = nullptr;
|
|
GLES3GPUInputAssembler *gpuInputAssembler = nullptr;
|
|
ccstd::vector<GLES3GPUDescriptorSet *> gpuDescriptorSets;
|
|
ccstd::vector<uint32_t> dynamicOffsets;
|
|
DynamicStates dynamicStates;
|
|
|
|
GLES3CmdBindStates() : GLESCmd(GLESCmdType::BIND_STATES) {}
|
|
|
|
void clear() override {
|
|
gpuPipelineState = nullptr;
|
|
gpuInputAssembler = nullptr;
|
|
gpuDescriptorSets.clear();
|
|
dynamicOffsets.clear();
|
|
}
|
|
};
|
|
|
|
class GLES3CmdDraw final : public GLESCmd {
|
|
public:
|
|
DrawInfo drawInfo;
|
|
|
|
GLES3CmdDraw() : GLESCmd(GLESCmdType::DRAW) {}
|
|
void clear() override {}
|
|
};
|
|
|
|
class GLES3CmdDispatch final : public GLESCmd {
|
|
public:
|
|
GLES3GPUDispatchInfo dispatchInfo;
|
|
|
|
GLES3CmdDispatch() : GLESCmd(GLESCmdType::DISPATCH) {}
|
|
void clear() override {
|
|
dispatchInfo.indirectBuffer = nullptr;
|
|
dispatchInfo.indirectOffset = 0;
|
|
}
|
|
};
|
|
|
|
class GLES3CmdBarrier final : public GLESCmd {
|
|
public:
|
|
GLbitfield barriers = 0U;
|
|
GLbitfield barriersByRegion = 0U;
|
|
|
|
GLES3CmdBarrier() : GLESCmd(GLESCmdType::BARRIER) {}
|
|
void clear() override {
|
|
barriers = 0U;
|
|
barriersByRegion = 0U;
|
|
}
|
|
};
|
|
|
|
class GLES3CmdUpdateBuffer final : public GLESCmd {
|
|
public:
|
|
GLES3GPUBuffer *gpuBuffer = nullptr;
|
|
const uint8_t *buffer = nullptr;
|
|
uint32_t size = 0;
|
|
uint32_t offset = 0;
|
|
|
|
GLES3CmdUpdateBuffer() : GLESCmd(GLESCmdType::UPDATE_BUFFER) {}
|
|
|
|
void clear() override {
|
|
gpuBuffer = nullptr;
|
|
buffer = nullptr;
|
|
}
|
|
};
|
|
|
|
class GLES3CmdCopyBufferToTexture final : public GLESCmd {
|
|
public:
|
|
GLES3GPUTexture *gpuTexture = nullptr;
|
|
const BufferTextureCopy *regions = nullptr;
|
|
uint32_t count = 0U;
|
|
const uint8_t *const *buffers = nullptr;
|
|
|
|
GLES3CmdCopyBufferToTexture() : GLESCmd(GLESCmdType::COPY_BUFFER_TO_TEXTURE) {}
|
|
|
|
void clear() override {
|
|
gpuTexture = nullptr;
|
|
regions = nullptr;
|
|
count = 0U;
|
|
buffers = nullptr;
|
|
}
|
|
};
|
|
|
|
class GLES3CmdBlitTexture final : public GLESCmd {
|
|
public:
|
|
GLES3GPUTextureView *gpuTextureSrcView = nullptr;
|
|
GLES3GPUTextureView *gpuTextureDstView = nullptr;
|
|
const TextureBlit *regions = nullptr;
|
|
uint32_t count = 0U;
|
|
Filter filter = Filter::POINT;
|
|
|
|
GLES3CmdBlitTexture() : GLESCmd(GLESCmdType::BLIT_TEXTURE) {}
|
|
|
|
void clear() override {
|
|
gpuTextureSrcView = nullptr;
|
|
gpuTextureDstView = nullptr;
|
|
regions = nullptr;
|
|
count = 0U;
|
|
}
|
|
};
|
|
|
|
enum class GLES3QueryType : uint8_t {
|
|
BEGIN,
|
|
END,
|
|
RESET,
|
|
GET_RESULTS,
|
|
};
|
|
|
|
class GLES3CmdQuery final : public GLESCmd {
|
|
public:
|
|
GLES3QueryPool *queryPool = nullptr;
|
|
GLES3QueryType type = GLES3QueryType::BEGIN;
|
|
uint32_t id = 0U;
|
|
|
|
GLES3CmdQuery() : GLESCmd(GLESCmdType::QUERY) {}
|
|
|
|
void clear() override {
|
|
queryPool = nullptr;
|
|
type = GLES3QueryType::BEGIN;
|
|
id = 0U;
|
|
}
|
|
};
|
|
|
|
struct GLES3CmdPackage {
|
|
CachedArray<GLESCmdType> cmds;
|
|
CachedArray<GLES3CmdBeginRenderPass *> beginRenderPassCmds;
|
|
CachedArray<GLES3CmdBindStates *> bindStatesCmds;
|
|
CachedArray<GLES3CmdDraw *> drawCmds;
|
|
CachedArray<GLES3CmdDispatch *> dispatchCmds;
|
|
CachedArray<GLES3CmdBarrier *> barrierCmds;
|
|
CachedArray<GLES3CmdUpdateBuffer *> updateBufferCmds;
|
|
CachedArray<GLES3CmdCopyBufferToTexture *> copyBufferToTextureCmds;
|
|
CachedArray<GLES3CmdBlitTexture *> blitTextureCmds;
|
|
CachedArray<GLES3CmdQuery *> queryCmds;
|
|
};
|
|
|
|
class GLES3GPUCommandAllocator final {
|
|
public:
|
|
CommandPool<GLES3CmdBeginRenderPass> beginRenderPassCmdPool;
|
|
CommandPool<GLES3CmdBindStates> bindStatesCmdPool;
|
|
CommandPool<GLES3CmdDraw> drawCmdPool;
|
|
CommandPool<GLES3CmdDispatch> dispatchCmdPool;
|
|
CommandPool<GLES3CmdBarrier> barrierCmdPool;
|
|
CommandPool<GLES3CmdUpdateBuffer> updateBufferCmdPool;
|
|
CommandPool<GLES3CmdCopyBufferToTexture> copyBufferToTextureCmdPool;
|
|
CommandPool<GLES3CmdBlitTexture> blitTextureCmdPool;
|
|
CommandPool<GLES3CmdQuery> queryCmdPool;
|
|
|
|
void clearCmds(GLES3CmdPackage *cmdPackage) {
|
|
if (cmdPackage->beginRenderPassCmds.size()) {
|
|
beginRenderPassCmdPool.freeCmds(cmdPackage->beginRenderPassCmds);
|
|
}
|
|
if (cmdPackage->bindStatesCmds.size()) {
|
|
bindStatesCmdPool.freeCmds(cmdPackage->bindStatesCmds);
|
|
}
|
|
if (cmdPackage->drawCmds.size()) {
|
|
drawCmdPool.freeCmds(cmdPackage->drawCmds);
|
|
}
|
|
if (cmdPackage->dispatchCmds.size()) {
|
|
dispatchCmdPool.freeCmds(cmdPackage->dispatchCmds);
|
|
}
|
|
if (cmdPackage->barrierCmds.size()) {
|
|
barrierCmdPool.freeCmds(cmdPackage->barrierCmds);
|
|
}
|
|
if (cmdPackage->updateBufferCmds.size()) {
|
|
updateBufferCmdPool.freeCmds(cmdPackage->updateBufferCmds);
|
|
}
|
|
if (cmdPackage->copyBufferToTextureCmds.size()) {
|
|
copyBufferToTextureCmdPool.freeCmds(cmdPackage->copyBufferToTextureCmds);
|
|
}
|
|
if (cmdPackage->blitTextureCmds.size()) {
|
|
blitTextureCmdPool.freeCmds(cmdPackage->blitTextureCmds);
|
|
}
|
|
if (cmdPackage->queryCmds.size()) {
|
|
queryCmdPool.freeCmds(cmdPackage->queryCmds);
|
|
}
|
|
|
|
cmdPackage->cmds.clear();
|
|
}
|
|
|
|
inline void reset() {
|
|
beginRenderPassCmdPool.release();
|
|
bindStatesCmdPool.release();
|
|
drawCmdPool.release();
|
|
dispatchCmdPool.release();
|
|
barrierCmdPool.release();
|
|
updateBufferCmdPool.release();
|
|
copyBufferToTextureCmdPool.release();
|
|
blitTextureCmdPool.release();
|
|
}
|
|
};
|
|
|
|
void cmdFuncGLES3CreateBuffer(GLES3Device *device, GLES3GPUBuffer *gpuBuffer);
|
|
void cmdFuncGLES3DestroyBuffer(GLES3Device *device, GLES3GPUBuffer *gpuBuffer);
|
|
void cmdFuncGLES3ResizeBuffer(GLES3Device *device, GLES3GPUBuffer *gpuBuffer);
|
|
void cmdFuncGLES3CreateTexture(GLES3Device *device, GLES3GPUTexture *gpuTexture);
|
|
void cmdFuncGLES3DestroyTexture(GLES3Device *device, GLES3GPUTexture *gpuTexture);
|
|
void cmdFuncGLES3ResizeTexture(GLES3Device *device, GLES3GPUTexture *gpuTexture);
|
|
void cmdFuncGLES3CreateTextureView(GLES3Device *device, GLES3GPUTextureView *gpuTextureView);
|
|
void cmdFuncGLES3CreateShader(GLES3Device *device, GLES3GPUShader *gpuShader, GLES3GPUPipelineLayout *pipelineLayout);
|
|
void cmdFuncGLES3DestroyShader(GLES3Device *device, GLES3GPUShader *gpuShader);
|
|
void cmdFuncGLES3CreateRenderPass(GLES3Device *device, GLES3GPURenderPass *gpuRenderPass);
|
|
void cmdFuncGLES3DestroyRenderPass(GLES3Device *device, GLES3GPURenderPass *gpuRenderPass);
|
|
void cmdFuncGLES3CreateInputAssembler(GLES3Device *device, GLES3GPUInputAssembler *gpuInputAssembler);
|
|
void cmdFuncGLES3DestroyInputAssembler(GLES3Device *device, GLES3GPUInputAssembler *gpuInputAssembler);
|
|
void cmdFuncGLES3CreateFramebuffer(GLES3Device *device, GLES3GPUFramebuffer *gpuFBO);
|
|
void cmdFuncGLES3DestroyFramebuffer(GLES3Device *device, GLES3GPUFramebuffer *gpuFBO);
|
|
void cmdFuncGLES3CreateGeneralBarrier(GLES3Device *device, GLES3GPUGeneralBarrier *barrier);
|
|
void cmdFuncGLES3CreateQueryPool(GLES3Device *device, GLES3GPUQueryPool *gpuQueryPool);
|
|
void cmdFuncGLES3DestroyQueryPool(GLES3Device *device, GLES3GPUQueryPool *gpuQueryPool);
|
|
void cmdFuncGLES3PrepareSamplerInfo(GLES3Device *device, GLES3GPUSampler *gpuSampler);
|
|
|
|
void completeBarrier(GLES3GPUGeneralBarrier *barrier);
|
|
|
|
void cmdFuncGLES3Query(GLES3Device *device, GLES3QueryPool *query, GLES3QueryType type, uint32_t id);
|
|
|
|
void cmdFuncGLES3BeginRenderPass(GLES3Device *device,
|
|
GLES3GPURenderPass *gpuRenderPass = nullptr,
|
|
GLES3GPUFramebuffer *gpuFramebuffer = nullptr,
|
|
const Rect *renderArea = nullptr,
|
|
const Color *clearColors = nullptr,
|
|
float clearDepth = 1.F,
|
|
uint32_t clearStencil = 0);
|
|
|
|
void cmdFuncGLES3EndRenderPass(GLES3Device *device);
|
|
|
|
void cmdFuncGLES3BindState(GLES3Device *device,
|
|
GLES3GPUPipelineState *gpuPipelineState,
|
|
GLES3GPUInputAssembler *gpuInputAssembler,
|
|
const GLES3GPUDescriptorSet *const *gpuDescriptorSets,
|
|
const uint32_t *dynamicOffsets = nullptr,
|
|
const DynamicStates *dynamicStates = nullptr);
|
|
|
|
void cmdFuncGLES3Draw(GLES3Device *device, const DrawInfo &drawInfo);
|
|
|
|
void cmdFuncGLES3UpdateBuffer(GLES3Device *device,
|
|
GLES3GPUBuffer *gpuBuffer,
|
|
const void *buffer,
|
|
uint32_t offset,
|
|
uint32_t size);
|
|
|
|
void cmdFuncGLES3CopyBuffersToTexture(GLES3Device *device,
|
|
const uint8_t *const *buffers,
|
|
GLES3GPUTexture *gpuTexture,
|
|
const BufferTextureCopy *regions,
|
|
uint32_t count);
|
|
void cmdFuncGLES3CopyTextureToBuffers(GLES3Device *device,
|
|
GLES3GPUTextureView *gpuTextureView,
|
|
uint8_t *const *buffers,
|
|
const BufferTextureCopy *regions,
|
|
uint32_t count);
|
|
|
|
void cmdFuncGLES3BlitTexture(GLES3Device *device,
|
|
GLES3GPUTextureView *gpuTextureSrcView,
|
|
GLES3GPUTextureView *gpuTextureDstView,
|
|
const TextureBlit *regions,
|
|
uint32_t count,
|
|
Filter filter);
|
|
|
|
void cmdFuncGLES3ExecuteCmds(GLES3Device *device, GLES3CmdPackage *cmdPackage);
|
|
|
|
void cmdFuncGLES3Dispatch(GLES3Device *device, const GLES3GPUDispatchInfo &info);
|
|
|
|
void cmdFuncGLES3MemoryBarrier(GLES3Device *device, GLbitfield barriers, GLbitfield barriersByRegion);
|
|
|
|
void cmdFuncGLES3InsertMarker(GLES3Device *device, GLsizei length, const char *marker);
|
|
void cmdFuncGLES3PushGroupMarker(GLES3Device *device, GLsizei length, const char *marker);
|
|
void cmdFuncGLES3PopGroupMarker(GLES3Device *device);
|
|
|
|
GLint cmdFuncGLES3GetMaxSampleCount(const GLES3Device *device, Format format, TextureUsage usage, TextureFlags flags);
|
|
|
|
} // namespace gfx
|
|
} // namespace cc
|
|
|