From 1ac15dd14bfa03a4902d2f08d3f02573c716f787 Mon Sep 17 00:00:00 2001 From: coulsonwang <> Date: Thu, 1 Nov 2018 16:17:28 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E3=80=90BugFix=E3=80=91release=20the=20t?= =?UTF-8?q?extures=20before=20cleaning=20the=20vertor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/BindGroup.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/BindGroup.cpp b/src/backend/BindGroup.cpp index 5964932..5a03ff6 100644 --- a/src/backend/BindGroup.cpp +++ b/src/backend/BindGroup.cpp @@ -55,6 +55,10 @@ BindGroup::TextureInfo& BindGroup::TextureInfo::operator=(TextureInfo&& rhs) rhs.retainTextures(); releaseTextures(); textures = rhs.textures; + + //release the textures before clearning the vertor + for (auto& texture : rhs.textures) + CC_SAFE_RELEASE(texture); rhs.textures.clear(); } return *this; From 4afa5654555fdb1e88651bc0de55db69f7a52a3a Mon Sep 17 00:00:00 2001 From: coulsonwang <> Date: Mon, 5 Nov 2018 11:02:38 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E3=80=90Feature=E3=80=91use=20releaseTex?= =?UTF-8?q?tures()=20to=20remove=20duplicated=20code=20and=20make=20the=20?= =?UTF-8?q?code=20looks=20clean?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/BindGroup.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/backend/BindGroup.cpp b/src/backend/BindGroup.cpp index 5a03ff6..6857b7e 100644 --- a/src/backend/BindGroup.cpp +++ b/src/backend/BindGroup.cpp @@ -56,9 +56,8 @@ BindGroup::TextureInfo& BindGroup::TextureInfo::operator=(TextureInfo&& rhs) releaseTextures(); textures = rhs.textures; - //release the textures before clearning the vertor - for (auto& texture : rhs.textures) - CC_SAFE_RELEASE(texture); + //release the textures before cleaning the vertor + rhs.releaseTextures(); rhs.textures.clear(); } return *this; From b2b22973d5500bd7cede4d54fb08ce5c32e140d2 Mon Sep 17 00:00:00 2001 From: coulsonwang <> Date: Wed, 7 Nov 2018 11:16:48 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E3=80=90Feature=E3=80=91caching=20for=20?= =?UTF-8?q?RenderPipeline,=20test=20succeed=20on=20MacOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cocos/math/HashAlgorithm.cpp | 28 +++ cocos/math/HashAlgorithm.h | 14 ++ src/backend/BlendState.cpp | 5 +- src/backend/BlendState.h | 2 + src/backend/Device.h | 7 +- src/backend/RenderPass.cpp | 16 ++ src/backend/RenderPass.h | 1 + src/backend/RenderPassDescriptor.cpp | 25 +++ src/backend/RenderPassDescriptor.h | 4 + src/backend/StringUtils.cpp | 200 ++++++++++++++++++++ src/backend/StringUtils.hpp | 33 ++++ src/backend/Texture.cpp | 3 + src/backend/Texture.h | 3 +- src/backend/metal/BlendStateMTL.h | 2 +- src/backend/metal/BlendStateMTL.mm | 1 + src/backend/metal/DepthStencilStateMTL.h | 1 + src/backend/metal/DeviceMTL.h | 16 +- src/backend/metal/DeviceMTL.mm | 109 +++++++++++ src/backend/metal/RenderPassMTL.mm | 6 +- src/backend/metal/RenderPipelineMTL.h | 3 + src/backend/metal/RenderPipelineMTL.mm | 58 ++++++ src/backend/metal/ShaderModuleMTL.h | 4 +- src/backend/metal/ShaderModuleMTL.mm | 10 + src/backend/metal/TextureMTL.mm | 7 + src/backend/metal/Utils.h | 1 + src/backend/metal/Utils.mm | 21 ++ test/Test.xcodeproj/project.pbxproj | 28 ++- test/tests/backend/BasicBackend.cpp | 10 +- test/tests/backend/BlendingBackend.cpp | 22 +-- test/tests/backend/BunnyBackend.cpp | 12 +- test/tests/backend/DepthTextureBackend.cpp | 28 +-- test/tests/backend/GuiProjectionBackend.cpp | 8 +- test/tests/backend/MultiTexturesBackend.cpp | 9 +- test/tests/backend/ParticleBackend.cpp | 11 +- test/tests/backend/PostProcessBackend.cpp | 16 +- test/tests/backend/StencilBackend.cpp | 26 +-- test/tests/backend/SubImageBackend.cpp | 8 +- test/tests/backend/Texture2DBackend.cpp | 10 +- 38 files changed, 672 insertions(+), 96 deletions(-) create mode 100755 cocos/math/HashAlgorithm.cpp create mode 100755 cocos/math/HashAlgorithm.h create mode 100644 src/backend/StringUtils.cpp create mode 100644 src/backend/StringUtils.hpp diff --git a/cocos/math/HashAlgorithm.cpp b/cocos/math/HashAlgorithm.cpp new file mode 100755 index 0000000..0464ddc --- /dev/null +++ b/cocos/math/HashAlgorithm.cpp @@ -0,0 +1,28 @@ + +#include "math/HashAlgorithm.h" +#include "math/TimeUtils.h" + +unsigned int HashAlgorithm::PJWHash(const char* str, size_t len) +{ +// INIT_TIMER +// START_TIMER + unsigned int BitsInUnsignedInt = (unsigned int)(sizeof(unsigned int) * 8); + unsigned int ThreeQuarters = (unsigned int)((BitsInUnsignedInt * 3) / 4); + unsigned int OneEighth = (unsigned int)(BitsInUnsignedInt / 8); + unsigned int HighBits = (unsigned int)(0xFFFFFFFF) << (BitsInUnsignedInt - OneEighth); + unsigned int hash = 0; + unsigned int test = 0; + + for (size_t i = 0; i < len; i++) + { + hash = (hash << OneEighth) + str[i]; + + if ((test = hash & HighBits) != 0) + { + hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits)); + } + } +// STOP_TIMER("HashAlgorithm::PJWHash") + return hash; +} +/* End Of P. J. Weinberger Hash Function */ diff --git a/cocos/math/HashAlgorithm.h b/cocos/math/HashAlgorithm.h new file mode 100755 index 0000000..051e992 --- /dev/null +++ b/cocos/math/HashAlgorithm.h @@ -0,0 +1,14 @@ + +#ifndef _HASHALGORITHM_H_ +#define _HASHALGORITHM_H_ + +#include + +class HashAlgorithm { + +public: + static unsigned int PJWHash(const char* str, size_t len); +}; + + +#endif /* _HASHALGORITHM_H_ */ diff --git a/src/backend/BlendState.cpp b/src/backend/BlendState.cpp index f4be052..6d7cee2 100644 --- a/src/backend/BlendState.cpp +++ b/src/backend/BlendState.cpp @@ -1,5 +1,8 @@ #include "BlendState.h" CC_BACKEND_BEGIN - +BlendState::BlendState(const BlendDescriptor& descriptor) +{ + _blendDescriptor = descriptor; +} CC_BACKEND_END diff --git a/src/backend/BlendState.h b/src/backend/BlendState.h index 420e598..0c1029e 100644 --- a/src/backend/BlendState.h +++ b/src/backend/BlendState.h @@ -25,6 +25,8 @@ class BlendState : public cocos2d::Ref { protected: virtual ~BlendState() = default; + BlendState(const BlendDescriptor& descriptor); + BlendDescriptor _blendDescriptor; }; CC_BACKEND_END diff --git a/src/backend/Device.h b/src/backend/Device.h index 70c7a0b..550121a 100644 --- a/src/backend/Device.h +++ b/src/backend/Device.h @@ -33,17 +33,22 @@ class Device : public cocos2d::Ref virtual Buffer* newBuffer(uint32_t size, BufferType type, BufferUsage usage) = 0; // Create a render pass, not auto released. virtual RenderPass* newRenderPass(const RenderPassDescriptor& descriptor) = 0; + // Cache RenderPass for reuse + virtual RenderPass* cacheRenderPass(const RenderPassDescriptor& descriptor) = 0; // Create a texture, not auto released. virtual Texture* newTexture(const TextureDescriptor& descriptor) = 0; // Create a auto released shader module. virtual ShaderModule* createShaderModule(ShaderStage stage, const std::string& source) = 0; + // Cache ShaderModule for reuse + virtual ShaderModule* cacheShaderModule(ShaderStage stage, const std::string& source) = 0; // Create a auto released depth stencil state. virtual DepthStencilState* createDepthStencilState(const DepthStencilDescriptor& descriptor) = 0; // Create a auto released blend state. virtual BlendState* createBlendState(const BlendDescriptor& descriptor) = 0; // Create a render pipeline, not auto released. virtual RenderPipeline* newRenderPipeline(const RenderPipelineDescriptor& descriptor) = 0; - + // Cache RenderPipeline for reuse + virtual RenderPipeline* cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) = 0; private: static Device* _instance; }; diff --git a/src/backend/RenderPass.cpp b/src/backend/RenderPass.cpp index d28bd87..f6a1d6a 100644 --- a/src/backend/RenderPass.cpp +++ b/src/backend/RenderPass.cpp @@ -13,4 +13,20 @@ RenderPass::RenderPass(const RenderPassDescriptor& descriptor) RenderPass::~RenderPass() {} +bool RenderPass::Find(const RenderPassDescriptor& descriptor) const +{ + if(_colorAttachmentsSet != descriptor.getColorAttachmentSet() || + _depthStencilAttachmentSet != descriptor.getDepthStencilAttachmentSet()) + return false; + + const RenderPassColorAttachments colorAttachment = descriptor.getColorAttachments(); + const RenderPassDepthStencilAttachment depthStencilAttachment = descriptor.getDepthStencilAttachment(); + + if(_colorAttachments == colorAttachment && + _depthStencilAttachment == depthStencilAttachment) + return true; + + return false; +} + CC_BACKEND_END diff --git a/src/backend/RenderPass.h b/src/backend/RenderPass.h index b34d1d9..033bf07 100644 --- a/src/backend/RenderPass.h +++ b/src/backend/RenderPass.h @@ -14,6 +14,7 @@ class RenderPass : public cocos2d::Ref inline const RenderPassDepthStencilAttachment& getDepthStencilAttachment() const { return _depthStencilAttachment; } inline const RenderPassColorAttachments& getColorAttachments() const { return _colorAttachments; } + bool Find(const RenderPassDescriptor& descriptor) const; protected: RenderPass(const RenderPassDescriptor& descriptor); diff --git a/src/backend/RenderPassDescriptor.cpp b/src/backend/RenderPassDescriptor.cpp index 1fd3d8b..404c884 100644 --- a/src/backend/RenderPassDescriptor.cpp +++ b/src/backend/RenderPassDescriptor.cpp @@ -49,6 +49,15 @@ void RenderPassColorAttachments::retainTextures() const CC_SAFE_RETAIN(texture); } +bool RenderPassColorAttachments::operator==(const RenderPassColorAttachments& colorAttachment) const +{ + if(needClearColor != colorAttachment.needClearColor || + clearColor != colorAttachment.clearColor) + return false; + + return textures == colorAttachment.textures; +} + RenderPassDepthStencilAttachment::RenderPassDepthStencilAttachment(const RenderPassDepthStencilAttachment& rhs) { *this = rhs; @@ -75,6 +84,22 @@ RenderPassDepthStencilAttachment& RenderPassDepthStencilAttachment::operator=(co return *this; } +bool RenderPassDepthStencilAttachment::operator==(const RenderPassDepthStencilAttachment& renderAttachment) const +{ + if(needClearDepth != renderAttachment.needClearDepth || + clearDepth != renderAttachment.clearDepth || + needClearStencil != renderAttachment.needClearStencil || + clearStencil != renderAttachment.clearStencil) + return false; + + if(texture && renderAttachment.texture) + return texture->getTextureHashCode() == renderAttachment.texture->getTextureHashCode(); + else if(!texture && !(renderAttachment.texture)) + return true; + + return false; +} + void RenderPassDescriptor::setColorAttachment(uint32_t attachment, Texture* texture) { assert(TextureUsage::RENDER_TARGET == texture->getTextureUsage()); diff --git a/src/backend/RenderPassDescriptor.h b/src/backend/RenderPassDescriptor.h index caf226c..b088a51 100644 --- a/src/backend/RenderPassDescriptor.h +++ b/src/backend/RenderPassDescriptor.h @@ -18,6 +18,7 @@ struct RenderPassColorAttachments ~RenderPassColorAttachments(); RenderPassColorAttachments& operator=(const RenderPassColorAttachments& rhs); void setTexture(uint32_t attachment, Texture* texture); + bool operator==(const RenderPassColorAttachments& colorAttachment) const; std::vector textures; @@ -35,6 +36,7 @@ struct RenderPassDepthStencilAttachment RenderPassDepthStencilAttachment(const RenderPassDepthStencilAttachment& rhs); ~RenderPassDepthStencilAttachment(); RenderPassDepthStencilAttachment& operator =(const RenderPassDepthStencilAttachment& rhs); + bool operator==(const RenderPassDepthStencilAttachment& renderAttachment) const; float clearDepth = 1.f; bool needClearDepth = false; @@ -58,6 +60,8 @@ class RenderPassDescriptor inline const RenderPassDepthStencilAttachment& getDepthStencilAttachment() const { return _depthStencilAttachment; } inline const RenderPassColorAttachments& getColorAttachments() const { return _colorAttachments; } + inline bool getColorAttachmentSet() const {return _colorAttachmentsSet;} + inline bool getDepthStencilAttachmentSet() const {return _depthStencilAttachmentSet;} private: bool _colorAttachmentsSet = false; diff --git a/src/backend/StringUtils.cpp b/src/backend/StringUtils.cpp new file mode 100644 index 0000000..2a0a479 --- /dev/null +++ b/src/backend/StringUtils.cpp @@ -0,0 +1,200 @@ +// +// StringUtils.cpp +// Test +// +// Created by Cocos on 2018/11/2. +// Copyright © 2018 cocos. All rights reserved. +// + +#include "StringUtils.hpp" + +CC_BACKEND_BEGIN + +std::string StringUtils::TextureFormat2String(const TextureFormat& textureFormat) +{ + switch (textureFormat) { + case TextureFormat::R8G8B8A8: + return "R8G8B8A8"; + case TextureFormat::R8G8B8: + return "R8G8B8"; + case TextureFormat::A8: + return "A8"; + default: + return ""; + } +} + +std::string StringUtils::TextureType2String(const TextureType& textureType) +{ + switch (textureType) { + case TextureType::TEXTURE_2D: + return "TEXTURE_2D"; + case TextureType::TEXTURE_CUBE: + return "TEXTURE_CUBE"; + default: + return ""; + } +} + +std::string StringUtils::TextureUsage2String(const TextureUsage& textureUsage) +{ + switch (textureUsage) { + case TextureUsage::READ: + return "READ"; + case TextureUsage::WRITE: + return "WRITE"; + case TextureUsage::RENDER_TARGET: + return "RENDER_TARGET"; + default: + return ""; + } +} + +std::string StringUtils::SamplerFilterType2String(const SamplerFilter& filterType) +{ + switch (filterType) { + case SamplerFilter::LINEAR: + return "LINEAR"; + case SamplerFilter::NEAREST: + return "NEAREST"; + default: + return ""; + } +} + +std::string StringUtils::SamplerAddressMode2String(const SamplerAddressMode& addressMode) +{ + switch (addressMode) { + case SamplerAddressMode::REPEAT: + return "REPEAT"; + case SamplerAddressMode::MIRROR_REPEAT: + return "MIRROR_REPEAT"; + case SamplerAddressMode::CLAMP_TO_EDGE: + return "CLAMP_TO_EDGE"; + default: + return ""; + } +} + +std::string StringUtils::SamplerDescriptor2String(const SamplerDescriptor& descriptor) +{ + std::string samplerInfo = descriptor.mipmapEnabled ? "mipmapEnable":"mipmapDisable"; + samplerInfo += SamplerFilterType2String(descriptor.magFilter); + samplerInfo += SamplerFilterType2String(descriptor.minFilter); + samplerInfo += SamplerFilterType2String(descriptor.mipmapFilter); + samplerInfo += SamplerAddressMode2String(descriptor.sAddressMode); + samplerInfo += SamplerAddressMode2String(descriptor.tAddressMode); + return samplerInfo; +} + +std::string StringUtils::StencilOperation2String(const StencilOperation& operation) +{ + switch (operation) { + case StencilOperation::KEEP: + return "KEEP"; + case StencilOperation::ZERO: + return "ZERO"; + case StencilOperation::REPLACE: + return "REPLACE"; + case StencilOperation::INVERT: + return "INVERT"; + case StencilOperation::INCREMENT_WRAP: + return "INCREMENT_WRAP"; + case StencilOperation::DECREMENT_WRAP: + return "DECREMENT_WRAP"; + default: + return ""; + } +} + +std::string StringUtils::CompareFunction2String(const CompareFunction& compareFunction) +{ + switch (compareFunction) { + case CompareFunction::NEVER: + return "NEVER"; + case CompareFunction::LESS: + return "LESS"; + case CompareFunction::LESS_EQUAL: + return "LESS_EQUAL"; + case CompareFunction::GREATER: + return "GREATER"; + case CompareFunction::GREATER_EQUAL: + return "GREATER_EQUAL"; + case CompareFunction::EQUAL: + return "EQUAL"; + case CompareFunction::NOT_EQUAL: + return "NOT_EQUAL"; + case CompareFunction::ALWAYS: + return "ALWAYS"; + default: + return ""; + } +} + +std::string StringUtils::ColorWriteMask2String(const ColorWriteMask& colorWriteMask) +{ + switch (colorWriteMask) { + case ColorWriteMask::NONE: + return "NONE"; + case ColorWriteMask::RED: + return "RED"; + case ColorWriteMask::GREEN: + return "GREEN"; + case ColorWriteMask::BLUE: + return "BLUE"; + case ColorWriteMask::ALPHA: + return "ALPHA"; + case ColorWriteMask::ALL: + return "ALL"; + default: + return ""; + } +} + +std::string StringUtils::BlendOperation2String(const BlendOperation& blendOperation) +{ + switch (blendOperation) { + case BlendOperation::ADD: + return "ADD"; + case BlendOperation::SUBTRACT: + return "SUBTRACT"; + case BlendOperation::RESERVE_SUBTRACT: + return "RESERVE_SUBTRACT"; + default: + return ""; + } +} + +std::string StringUtils::BlendFactor2String(const BlendFactor& blendFactor) +{ + switch (blendFactor) { + case BlendFactor::ZERO: + return "ZERO"; + case BlendFactor::ONE: + return "ONE"; + case BlendFactor::SRC_COLOR: + return "SRC_COLOR"; + case BlendFactor::ONE_MINUS_SRC_COLOR: + return "ONE_MINUS_SRC_COLOR"; + case BlendFactor::SRC_ALPHA: + return "SRC_ALPHA"; + case BlendFactor::ONE_MINUS_SRC_ALPHA: + return "ONE_MINUS_SRC_ALPHA"; + case BlendFactor::DST_COLOR: + return "DST_COLOR"; + case BlendFactor::ONE_MINUS_DST_COLOR: + return "ONE_MINUS_DST_COLOR"; + case BlendFactor::DST_ALPHA: + return "DST_ALPHA"; + case BlendFactor::ONE_MINUS_DST_ALPHA: + return "ONE_MINUS_DST_ALPHA"; + case BlendFactor::SRC_ALPHA_SATURATE: + return "SRC_ALPHA_SATURATE"; + case BlendFactor::BLEND_CLOLOR: + return "BLEND_CLOLOR"; + default: + return ""; + } +} + +CC_BACKEND_END diff --git a/src/backend/StringUtils.hpp b/src/backend/StringUtils.hpp new file mode 100644 index 0000000..feb5edd --- /dev/null +++ b/src/backend/StringUtils.hpp @@ -0,0 +1,33 @@ +// +// StringUtils.hpp +// Test +// +// Created by Cocos on 2018/11/2. +// Copyright © 2018 cocos. All rights reserved. +// + +#ifndef StringUtils_hpp +#define StringUtils_hpp + +#include +#include "Types.h" +CC_BACKEND_BEGIN + +class StringUtils +{ +public: + static std::string TextureFormat2String(const TextureFormat& textureFormat); + static std::string TextureType2String(const TextureType& textureType); + static std::string TextureUsage2String(const TextureUsage& textureUsage); + static std::string SamplerFilterType2String(const SamplerFilter& filterType); + static std::string SamplerAddressMode2String(const SamplerAddressMode& addressMode); + static std::string SamplerDescriptor2String(const SamplerDescriptor& descriptor); + static std::string StencilOperation2String(const StencilOperation& operation); + static std::string CompareFunction2String(const CompareFunction& compareFunction); + static std::string ColorWriteMask2String(const ColorWriteMask& colorWriteMask); + static std::string BlendOperation2String(const BlendOperation& blendOperation); + static std::string BlendFactor2String(const BlendFactor& blendFactor); +}; + +CC_BACKEND_END +#endif /* StringUtils_hpp */ diff --git a/src/backend/Texture.cpp b/src/backend/Texture.cpp index e224f28..e399633 100644 --- a/src/backend/Texture.cpp +++ b/src/backend/Texture.cpp @@ -1,4 +1,7 @@ #include "Texture.h" +#include +#include "math/HashAlgorithm.h" +#include "StringUtils.hpp" CC_BACKEND_BEGIN diff --git a/src/backend/Texture.h b/src/backend/Texture.h index bb9c1f4..79dbee4 100644 --- a/src/backend/Texture.h +++ b/src/backend/Texture.h @@ -27,7 +27,7 @@ class Texture : public cocos2d::Ref inline TextureUsage getTextureUsage() const { return _textureUsage; } inline uint32_t getWidth() const { return _width; } inline uint32_t getHeight() const { return _height; } - + inline uint32_t getTextureHashCode() const {return _textureHashCode;} protected: Texture(const TextureDescriptor& descriptor); virtual ~Texture(); @@ -40,6 +40,7 @@ class Texture : public cocos2d::Ref TextureFormat _textureFormat = TextureFormat::R8G8B8; TextureUsage _textureUsage = TextureUsage::READ; bool _isMipmapEnabled = false; + uint32_t _textureHashCode = 0; }; CC_BACKEND_END diff --git a/src/backend/metal/BlendStateMTL.h b/src/backend/metal/BlendStateMTL.h index 43b95dc..4033e39 100644 --- a/src/backend/metal/BlendStateMTL.h +++ b/src/backend/metal/BlendStateMTL.h @@ -26,7 +26,7 @@ class BlendStateMTL : public BlendState BlendStateMTL(const BlendDescriptor& descriptor); inline const BlendDescriptorMTL& getBlendDescriptorMTL() const { return _blendDescriptorMTL; } - + inline const BlendDescriptor& getBlendDescriptor() const {return _blendDescriptor;} private: BlendDescriptorMTL _blendDescriptorMTL; }; diff --git a/src/backend/metal/BlendStateMTL.mm b/src/backend/metal/BlendStateMTL.mm index fa8b6a6..0331eeb 100644 --- a/src/backend/metal/BlendStateMTL.mm +++ b/src/backend/metal/BlendStateMTL.mm @@ -67,6 +67,7 @@ MTLBlendOperation toMTLBlendOperation(BlendOperation operation) } BlendStateMTL::BlendStateMTL(const BlendDescriptor& descriptor) +: BlendState(descriptor) { _blendDescriptorMTL.writeMask = toMTLColorWriteMask(descriptor.writeMask); _blendDescriptorMTL.blendEnabled = descriptor.blendEnabled; diff --git a/src/backend/metal/DepthStencilStateMTL.h b/src/backend/metal/DepthStencilStateMTL.h index 0ad8b09..61f6ef5 100644 --- a/src/backend/metal/DepthStencilStateMTL.h +++ b/src/backend/metal/DepthStencilStateMTL.h @@ -12,6 +12,7 @@ class DepthStencilStateMTL : public DepthStencilState ~DepthStencilStateMTL(); inline id getMTLDepthStencilState() const { return _mtlDepthStencilState; } + inline const DepthStencilDescriptor& getDepthStencilDescriptor() const {return _depthStencilInfo;} private: id _mtlDepthStencilState = nil; diff --git a/src/backend/metal/DeviceMTL.h b/src/backend/metal/DeviceMTL.h index 24fb040..8dafb8c 100644 --- a/src/backend/metal/DeviceMTL.h +++ b/src/backend/metal/DeviceMTL.h @@ -3,7 +3,8 @@ #include "../Device.h" #import #import - +#import +#include CC_BACKEND_BEGIN class DeviceMTL : public Device @@ -23,20 +24,31 @@ class DeviceMTL : public Device virtual Buffer* newBuffer(uint32_t size, BufferType type, BufferUsage usage) override; virtual RenderPass* newRenderPass(const RenderPassDescriptor& descriptor) override; virtual Texture* newTexture(const TextureDescriptor& descriptor) override; + virtual RenderPass* cacheRenderPass(const RenderPassDescriptor& descriptor) override; virtual ShaderModule* createShaderModule(ShaderStage stage, const std::string& source) override; + virtual ShaderModule* cacheShaderModule(ShaderStage stage, const std::string& source) override; virtual DepthStencilState* createDepthStencilState(const DepthStencilDescriptor& descriptor) override; virtual BlendState* createBlendState(const BlendDescriptor& descriptor) override; virtual RenderPipeline* newRenderPipeline(const RenderPipelineDescriptor& descriptor) override; - + virtual RenderPipeline* cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) override; inline id getMTLDevice() const { return _mtlDevice; } inline id getMTLCommandQueue() const { return _mtlCommandQueue; } +private: + size_t findRenderPassInCache(const RenderPassDescriptor& descriptor); + size_t findShaderModuleInCache(const ShaderStage& stage, const std::string& source); + size_t findRenderPipelineInCache(const RenderPipelineDescriptor& descriptor); + private: static CAMetalLayer* _metalLayer; static id _currentDrawable; id _mtlDevice = nil; id _mtlCommandQueue = nil; + + std::vector _cacheRenderPass; + std::vector _cacheShaderModule; + std::vector _cacheRenderPipeline; }; CC_BACKEND_END diff --git a/src/backend/metal/DeviceMTL.mm b/src/backend/metal/DeviceMTL.mm index 8d4b1e7..87b5943 100644 --- a/src/backend/metal/DeviceMTL.mm +++ b/src/backend/metal/DeviceMTL.mm @@ -8,6 +8,7 @@ #include "TextureMTL.h" #include "BlendStateMTL.h" #include "Utils.h" +#include "math/HashAlgorithm.h" CC_BACKEND_BEGIN @@ -48,6 +49,17 @@ DeviceMTL::~DeviceMTL() { + for(auto& renderPass : _cacheRenderPass) + CC_SAFE_RELEASE(renderPass); + _cacheRenderPass.clear(); + + for(auto& renderPipeline : _cacheRenderPipeline) + CC_SAFE_RELEASE(renderPipeline); + _cacheRenderPipeline.clear(); + + for(auto& shaderModule : _cacheShaderModule) + CC_SAFE_RELEASE(shaderModule); + _cacheShaderModule.clear(); } CommandBuffer* DeviceMTL::newCommandBuffer() @@ -70,6 +82,37 @@ return new (std::nothrow) RenderPassMTL(_mtlDevice, descriptor); } +size_t DeviceMTL::findRenderPassInCache(const RenderPassDescriptor& descriptor) +{ + for(std::vector::const_iterator iter = _cacheRenderPass.begin(); iter != _cacheRenderPass.end(); iter++) + { + bool bFound = (*iter)->Find(descriptor); + if(bFound) + { + return iter - _cacheRenderPass.begin(); + } + } + + return -1; +} + +RenderPass* DeviceMTL::cacheRenderPass(const RenderPassDescriptor& descriptor) +{ + auto posIndex = findRenderPassInCache(descriptor); + if(posIndex != -1) + { + _cacheRenderPass[posIndex]->retain(); + return _cacheRenderPass[posIndex]; + } + else + { + RenderPass* renderPass = newRenderPass(descriptor); + renderPass->retain(); + _cacheRenderPass.push_back(renderPass); + return renderPass; + } +} + ShaderModule* DeviceMTL::createShaderModule(ShaderStage stage, const std::string& source) { auto ret = new (std::nothrow) ShaderModuleMTL(_mtlDevice, stage, source); @@ -79,6 +122,39 @@ return ret; } +size_t DeviceMTL::findShaderModuleInCache(const ShaderStage& stage, const std::string& source) +{ + for(std::vector::const_iterator iter = _cacheShaderModule.begin(); iter != _cacheShaderModule.end(); iter++) + { + ShaderModuleMTL* shader = static_cast(*iter); + if(shader->getShaderStage() != stage) + continue; + bool bFound = shader->Find(source); + if(bFound) + { + return iter - _cacheShaderModule.begin(); + } + } + return -1; +} + +ShaderModule* DeviceMTL::cacheShaderModule(ShaderStage stage, const std::string& source) +{ + auto posIndex = findShaderModuleInCache(stage, source); + if (posIndex != -1) + { + _cacheShaderModule[posIndex]->retain(); + return _cacheShaderModule[posIndex]; + } + else + { + ShaderModule* shaderModule = createShaderModule(stage, source); + shaderModule->retain(); + _cacheShaderModule.push_back(shaderModule); + return shaderModule; + } +} + DepthStencilState* DeviceMTL::createDepthStencilState(const DepthStencilDescriptor& descriptor) { auto ret = new (std::nothrow) DepthStencilStateMTL(_mtlDevice, descriptor); @@ -102,4 +178,37 @@ return new (std::nothrow) RenderPipelineMTL(_mtlDevice, descriptor); } +size_t DeviceMTL::findRenderPipelineInCache(const RenderPipelineDescriptor& descriptor) +{ + for(std::vector::const_iterator iter = _cacheRenderPipeline.begin(); iter != _cacheRenderPipeline.end(); iter++) + { + RenderPipelineMTL* renderPipeline = static_cast(*iter); + if(renderPipeline->getHash() == renderPipeline->createHash(descriptor)) + { + return iter - _cacheRenderPipeline.begin(); + } + } + return -1; +} + +RenderPipeline* DeviceMTL::cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) +{ + auto posIndex = findRenderPipelineInCache(descriptor); + if (posIndex != -1) + { + _cacheRenderPipeline[posIndex]->retain(); + return _cacheRenderPipeline[posIndex]; + } + else + { + RenderPipeline* renderPipeline = newRenderPipeline(descriptor); + renderPipeline->retain(); + _cacheRenderPipeline.push_back(renderPipeline); +// _cacheRenderPipeline[_cacheRenderPipeline.size()] = renderPipeline; +// _cacheRenderPipelineDescriptor.push_back(descriptor._hash); + + return renderPipeline; + } + +} CC_BACKEND_END diff --git a/src/backend/metal/RenderPassMTL.mm b/src/backend/metal/RenderPassMTL.mm index e2ba064..e94aa94 100644 --- a/src/backend/metal/RenderPassMTL.mm +++ b/src/backend/metal/RenderPassMTL.mm @@ -11,7 +11,7 @@ if (_colorAttachmentsSet || _depthStencilAttachmentSet) _mtlRenderPassDescritpr = [MTLRenderPassDescriptor renderPassDescriptor]; else - _mtlRenderPassDescritpr = Utils::getDefaultRenderPassDescriptor(); + _mtlRenderPassDescritpr = Utils::createNewRenderPassDescriptor(); [_mtlRenderPassDescritpr retain]; setColorAttachments(descriptor); @@ -32,7 +32,11 @@ if (!_colorAttachmentsSet) _mtlRenderPassDescritpr.colorAttachments[0].texture = defaultRenderPassDescriptor.colorAttachments[0].texture; if (!_depthStencilAttachmentSet) + { +// When depth and stencil are used together, the texture bound to the depth and stencil render pass attachments must be the same depth and stencil _mtlRenderPassDescritpr.depthAttachment.texture = defaultRenderPassDescriptor.depthAttachment.texture; + _mtlRenderPassDescritpr.stencilAttachment.texture = defaultRenderPassDescriptor.stencilAttachment.texture; + } } return _mtlRenderPassDescritpr; diff --git a/src/backend/metal/RenderPipelineMTL.h b/src/backend/metal/RenderPipelineMTL.h index 58be19c..74991d4 100644 --- a/src/backend/metal/RenderPipelineMTL.h +++ b/src/backend/metal/RenderPipelineMTL.h @@ -28,6 +28,8 @@ class RenderPipelineMTL : public RenderPipeline inline const std::vector& getFragmentUniforms() const { return _fragmentUniforms; } inline const std::vector& getVertexTextures() const { return _vertexTextures; } inline const std::vector& getFragmentTextures() const { return _fragmentTextures; } + inline const uint32_t getHash() const {return _hashRenderPipelineDescriptor;}; + uint32_t createHash(const RenderPipelineDescriptor& descriptor); private: void setVertexLayout(MTLRenderPipelineDescriptor*, const RenderPipelineDescriptor&); @@ -47,6 +49,7 @@ class RenderPipelineMTL : public RenderPipeline MTLRenderPipelineDescriptor* _mtlRenderPipelineDescriptor = nil; BlendDescriptorMTL _blendDescriptorMTL; + uint32_t _hashRenderPipelineDescriptor = 0; }; CC_BACKEND_END diff --git a/src/backend/metal/RenderPipelineMTL.mm b/src/backend/metal/RenderPipelineMTL.mm index 317de28..7ef134f 100644 --- a/src/backend/metal/RenderPipelineMTL.mm +++ b/src/backend/metal/RenderPipelineMTL.mm @@ -3,6 +3,8 @@ #include "ShaderModuleMTL.h" #include "DepthStencilStateMTL.h" #include "Utils.h" +#include "../StringUtils.hpp" +#include "math/HashAlgorithm.h" CC_BACKEND_BEGIN @@ -92,6 +94,8 @@ MTLVertexFormat toMTLVertexFormat(VertexFormat vertexFormat) auto blendState = static_cast(descriptor.getBlendState()); if (blendState) _blendDescriptorMTL = blendState->getBlendDescriptorMTL(); + + _hashRenderPipelineDescriptor = createHash(descriptor); } RenderPipelineMTL::~RenderPipelineMTL() @@ -193,4 +197,58 @@ MTLVertexFormat toMTLVertexFormat(VertexFormat vertexFormat) colorAttachmentDescriptor.destinationAlphaBlendFactor = _blendDescriptorMTL.destinationAlphaBlendFactor; } +uint32_t RenderPipelineMTL::createHash(const RenderPipelineDescriptor& descriptor) +{ + std::string info = ""; + ShaderModuleMTL* vertModule = static_cast(descriptor.getVertexShaderModule()); + ShaderModuleMTL* fragModule = static_cast(descriptor.getFragmentShaderModule()); + if(vertModule || fragModule) + { + info += std::to_string(vertModule->getHash()); + info += std::to_string(fragModule->getHash()); + } + + DepthStencilState* depStencilState = descriptor.getDepthStencilState(); + if(depStencilState) + { + DepthStencilStateMTL* depthStencilStateMTL = static_cast(depStencilState); + DepthStencilDescriptor depthStencilDescriptor = depthStencilStateMTL->getDepthStencilDescriptor(); + + info += StringUtils::CompareFunction2String(depthStencilDescriptor.depthCompareFunction); + info += depthStencilDescriptor.depthWriteEnabled; + + info += StringUtils::StencilOperation2String(depthStencilDescriptor.backFaceStencil.stencilFailureOperation); + info += StringUtils::StencilOperation2String(depthStencilDescriptor.backFaceStencil.depthFailureOperation); + info += StringUtils::StencilOperation2String(depthStencilDescriptor.backFaceStencil.depthStencilPassOperation); + info += StringUtils::CompareFunction2String(depthStencilDescriptor.backFaceStencil.stencilCompareFunction); + info += depthStencilDescriptor.backFaceStencil.readMask; + info += depthStencilDescriptor.backFaceStencil.writeMask; + + info += StringUtils::StencilOperation2String(depthStencilDescriptor.frontFaceStencil.stencilFailureOperation); + info += StringUtils::StencilOperation2String(depthStencilDescriptor.frontFaceStencil.depthFailureOperation); + info += StringUtils::StencilOperation2String(depthStencilDescriptor.frontFaceStencil.depthStencilPassOperation); + info += StringUtils::CompareFunction2String(depthStencilDescriptor.frontFaceStencil.stencilCompareFunction); + info += depthStencilDescriptor.frontFaceStencil.readMask; + info += depthStencilDescriptor.frontFaceStencil.writeMask; + } + + BlendState* blendState = descriptor.getBlendState(); + if(blendState) + { + BlendStateMTL* blendStateMTL = static_cast(blendState); + BlendDescriptor blendDescriptor = blendStateMTL->getBlendDescriptor(); + + info += StringUtils::ColorWriteMask2String(blendDescriptor.writeMask); + info += blendDescriptor.blendEnabled; + info += StringUtils::BlendOperation2String(blendDescriptor.rgbBlendOperation); + info += StringUtils::BlendOperation2String(blendDescriptor.alphaBlendOperation); + info += StringUtils::BlendFactor2String(blendDescriptor.sourceRGBBlendFactor); + info += StringUtils::BlendFactor2String(blendDescriptor.destinationRGBBlendFactor); + info += StringUtils::BlendFactor2String(blendDescriptor.sourceAlphaBlendFactor); + info += StringUtils::BlendFactor2String(blendDescriptor.destinationAlphaBlendFactor); + } + + return HashAlgorithm::PJWHash(info.c_str(), info.length()); +} + CC_BACKEND_END diff --git a/src/backend/metal/ShaderModuleMTL.h b/src/backend/metal/ShaderModuleMTL.h index de123c8..2901fb1 100644 --- a/src/backend/metal/ShaderModuleMTL.h +++ b/src/backend/metal/ShaderModuleMTL.h @@ -20,7 +20,8 @@ class ShaderModuleMTL : public ShaderModule inline const std::shared_ptr& getUniformBuffer() const { return _uniformBuffer; } inline const std::vector& getUniforms() const { return _uniforms; } inline const std::vector& getTextures() const { return _textures; } - + inline const uint32_t getHash() const {return _hashCode;} + bool Find(const std::string& source); private: void parseUniform(id mtlDevice, glslopt_shader* shader); void parseTexture(id mtlDevice, glslopt_shader* shader); @@ -32,6 +33,7 @@ class ShaderModuleMTL : public ShaderModule // Texture index is the same as vector index. std::vector _textures; + uint32_t _hashCode = 0; }; CC_BACKEND_END diff --git a/src/backend/metal/ShaderModuleMTL.mm b/src/backend/metal/ShaderModuleMTL.mm index 497b1bd..417b314 100644 --- a/src/backend/metal/ShaderModuleMTL.mm +++ b/src/backend/metal/ShaderModuleMTL.mm @@ -2,6 +2,7 @@ #include "DeviceMTL.h" #include "glsl_optimizer/glsl/glsl_optimizer.h" +#include "math/HashAlgorithm.h" CC_BACKEND_BEGIN @@ -59,6 +60,8 @@ assert(false); } + _hashCode = HashAlgorithm::PJWHash(source.c_str(), source.length()); + glslopt_shader_delete(glslShader); glslopt_cleanup(ctx); } @@ -102,4 +105,11 @@ } } +bool ShaderModuleMTL::Find(const std::string& source) +{ + uint32_t hashShader = HashAlgorithm::PJWHash(source.c_str(), source.length()); + + return _hashCode == hashShader ? true : false; +} + CC_BACKEND_END diff --git a/src/backend/metal/TextureMTL.mm b/src/backend/metal/TextureMTL.mm index 793fe85..de8c8fc 100644 --- a/src/backend/metal/TextureMTL.mm +++ b/src/backend/metal/TextureMTL.mm @@ -1,5 +1,6 @@ #include "TextureMTL.h" #include "Utils.h" +#include "math/HashAlgorithm.h" CC_BACKEND_BEGIN @@ -91,6 +92,12 @@ bool convertData(uint8_t* src, uint32_t length, TextureFormat format, uint8_t** void TextureMTL::updateData(uint8_t* data) { + uint8_t componentCount = (TextureFormat::R8G8B8 == _textureFormat)?3:4; + size_t dataLen = _mtlTexture.width * _mtlTexture.height*componentCount; + uint32_t dataHash = HashAlgorithm::PJWHash((char*)data, dataLen); + if(_textureHashCode == dataHash) + return; + _textureHashCode = dataHash; updateSubData(0, 0, (uint32_t)_mtlTexture.width, (uint32_t)_mtlTexture.height, data); } diff --git a/src/backend/metal/Utils.h b/src/backend/metal/Utils.h index 0dd35af..cfc0102 100644 --- a/src/backend/metal/Utils.h +++ b/src/backend/metal/Utils.h @@ -13,6 +13,7 @@ class Utils static id getTempDepthStencilAttachmentTexture(); static void createDefaultRenderPassDescriptor(); + static MTLRenderPassDescriptor* createNewRenderPassDescriptor(); static MTLRenderPassDescriptor* getDefaultRenderPassDescriptor(); static void updateDefaultRenderPassDescriptor(id texture); static MTLPixelFormat getDefaultDepthStencilAttachmentPixelFormat(); diff --git a/src/backend/metal/Utils.mm b/src/backend/metal/Utils.mm index c159fc6..9b0aa43 100644 --- a/src/backend/metal/Utils.mm +++ b/src/backend/metal/Utils.mm @@ -63,6 +63,27 @@ Utils::_defaultRenderPassDescriptor.stencilAttachment.loadAction = MTLLoadActionClear; [Utils::_defaultRenderPassDescriptor retain]; } + +} + +MTLRenderPassDescriptor* Utils:: createNewRenderPassDescriptor() +{ + MTLRenderPassDescriptor* _renderPassDescriptor = [MTLRenderPassDescriptor renderPassDescriptor]; + + //The MTLLoadActionDontCare action allows the GPU to avoid loading the existing contents of the texture, ensuring the best performance. + _renderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear; + _renderPassDescriptor.colorAttachments[0].storeAction = MTLStoreActionStore; + + // Set default depth and stencil texture. + auto defaultDepthStencilTexture = Utils::createDepthStencilAttachmentTexture(); + _renderPassDescriptor.depthAttachment.texture = defaultDepthStencilTexture; + _renderPassDescriptor.stencilAttachment.texture = defaultDepthStencilTexture; + + _renderPassDescriptor.depthAttachment.loadAction = MTLLoadActionClear; + _renderPassDescriptor.stencilAttachment.loadAction = MTLLoadActionClear; + [_renderPassDescriptor retain]; + + return _renderPassDescriptor; } MTLRenderPassDescriptor* Utils::getDefaultRenderPassDescriptor() diff --git a/test/Test.xcodeproj/project.pbxproj b/test/Test.xcodeproj/project.pbxproj index f656910..4be1007 100644 --- a/test/Test.xcodeproj/project.pbxproj +++ b/test/Test.xcodeproj/project.pbxproj @@ -196,10 +196,14 @@ 469492801FE252EA008D19CC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4694927F1FE252E3008D19CC /* Cocoa.framework */; }; 469492821FE25305008D19CC /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 469492811FE252FB008D19CC /* IOKit.framework */; }; 469492841FE25314008D19CC /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 469492831FE2530E008D19CC /* CoreVideo.framework */; }; + ED0875D2218BF27900B7F6A4 /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED0875D0218BF27900B7F6A4 /* StringUtils.cpp */; }; + ED0875D3218BF27900B7F6A4 /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED0875D0218BF27900B7F6A4 /* StringUtils.cpp */; }; + ED2F9F46218FDC40008E6BC2 /* ParticleBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED2F9F45218FDC3F008E6BC2 /* ParticleBackend.cpp */; }; + ED2F9F47218FDC40008E6BC2 /* ParticleBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED2F9F45218FDC3F008E6BC2 /* ParticleBackend.cpp */; }; ED3B4C42217E15C000D982A0 /* GuiProjectionBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED3B4C3E217E15BF00D982A0 /* GuiProjectionBackend.cpp */; }; ED3B4C43217E15C000D982A0 /* GuiProjectionBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED3B4C3E217E15BF00D982A0 /* GuiProjectionBackend.cpp */; }; - ED3B4C44217E15C000D982A0 /* ParticleBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED3B4C41217E15C000D982A0 /* ParticleBackend.cpp */; }; - ED3B4C45217E15C000D982A0 /* ParticleBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED3B4C41217E15C000D982A0 /* ParticleBackend.cpp */; }; + ED54310621880D080048B076 /* HashAlgorithm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED54310521880D080048B076 /* HashAlgorithm.cpp */; }; + ED54310721880D080048B076 /* HashAlgorithm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED54310521880D080048B076 /* HashAlgorithm.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -485,10 +489,14 @@ 4694927F1FE252E3008D19CC /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 469492811FE252FB008D19CC /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 469492831FE2530E008D19CC /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; + ED0875D0218BF27900B7F6A4 /* StringUtils.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = StringUtils.cpp; sourceTree = ""; }; + ED0875D1218BF27900B7F6A4 /* StringUtils.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = StringUtils.hpp; sourceTree = ""; }; + ED2F9F45218FDC3F008E6BC2 /* ParticleBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParticleBackend.cpp; sourceTree = ""; }; ED3B4C3E217E15BF00D982A0 /* GuiProjectionBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GuiProjectionBackend.cpp; sourceTree = ""; }; ED3B4C3F217E15BF00D982A0 /* ParticleBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParticleBackend.h; sourceTree = ""; }; ED3B4C40217E15C000D982A0 /* GuiProjectionBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GuiProjectionBackend.h; sourceTree = ""; }; - ED3B4C41217E15C000D982A0 /* ParticleBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParticleBackend.cpp; sourceTree = ""; }; + ED54310421880D080048B076 /* HashAlgorithm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashAlgorithm.h; sourceTree = ""; }; + ED54310521880D080048B076 /* HashAlgorithm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HashAlgorithm.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -625,6 +633,8 @@ 1A255D9820034B0D00069420 /* math */ = { isa = PBXGroup; children = ( + ED54310521880D080048B076 /* HashAlgorithm.cpp */, + ED54310421880D080048B076 /* HashAlgorithm.h */, 1A255DB720034B0D00069420 /* CCAffineTransform.cpp */, 1A255DA820034B0D00069420 /* CCAffineTransform.h */, 1A255DA620034B0D00069420 /* CCGeometry.cpp */, @@ -844,6 +854,8 @@ 460373AF212FA9EB00DC9ED4 /* backend */ = { isa = PBXGroup; children = ( + ED0875D0218BF27900B7F6A4 /* StringUtils.cpp */, + ED0875D1218BF27900B7F6A4 /* StringUtils.hpp */, 460374512148F78600DC9ED4 /* Backend.h */, 460373F9213932AE00DC9ED4 /* BindGroup.cpp */, 460373FA213932AE00DC9ED4 /* BindGroup.h */, @@ -907,9 +919,9 @@ 460373D821363EDD00DC9ED4 /* backend */ = { isa = PBXGroup; children = ( + ED2F9F45218FDC3F008E6BC2 /* ParticleBackend.cpp */, ED3B4C3E217E15BF00D982A0 /* GuiProjectionBackend.cpp */, ED3B4C40217E15C000D982A0 /* GuiProjectionBackend.h */, - ED3B4C41217E15C000D982A0 /* ParticleBackend.cpp */, ED3B4C3F217E15BF00D982A0 /* ParticleBackend.h */, 460375802150C91C00DC9ED4 /* MultiTexturesBackend.cpp */, 4603757F2150C91C00DC9ED4 /* MultiTexturesBackend.h */, @@ -1287,7 +1299,7 @@ 1ACB61B51FF6028B0007F081 /* ioapi_mem.cpp in Sources */, 4603743F2147742800DC9ED4 /* DepthStencilState.cpp in Sources */, 1A255E2C20034B0D00069420 /* CCES2Renderer-ios.m in Sources */, - ED3B4C45217E15C000D982A0 /* ParticleBackend.cpp in Sources */, + ED0875D3218BF27900B7F6A4 /* StringUtils.cpp in Sources */, 46037417214247C200DC9ED4 /* VertexLayout.cpp in Sources */, 1A255E2A20034B0D00069420 /* CCImage.cpp in Sources */, 1A255E3020034B0D00069420 /* CCDevice-ios.mm in Sources */, @@ -1296,6 +1308,7 @@ 1A255E2420034B0D00069420 /* CCDevice-apple.mm in Sources */, 1A255E2E20034B0D00069420 /* CCEAGLView-ios.mm in Sources */, 1A255E5C20034B0D00069420 /* Vec3.cpp in Sources */, + ED2F9F47218FDC40008E6BC2 /* ParticleBackend.cpp in Sources */, 46233BEE2176C979000F1F21 /* StencilBackend.cpp in Sources */, 1A255E6E20034B0D00069420 /* pvr.cpp in Sources */, 46037414214247B100DC9ED4 /* RenderPass.cpp in Sources */, @@ -1307,6 +1320,7 @@ 1ACB61B71FF6028B0007F081 /* unzip.cpp in Sources */, 1A255E4820034B0D00069420 /* MathUtil.cpp in Sources */, 1ACB61B81FF6028F0007F081 /* tinyxml2.cpp in Sources */, + ED54310721880D080048B076 /* HashAlgorithm.cpp in Sources */, 1A255E5020034B0D00069420 /* TransformUtils.cpp in Sources */, 1A255E5A20034B0D00069420 /* Vec2.cpp in Sources */, ); @@ -1347,7 +1361,6 @@ 1A255E2720034B0D00069420 /* CCSAXParser.cpp in Sources */, 46233BEA217446B3000F1F21 /* BlendingBackend.cpp in Sources */, 468BD2E32154FE75007BCACF /* RenderPassDescriptor.cpp in Sources */, - ED3B4C44217E15C000D982A0 /* ParticleBackend.cpp in Sources */, 461DD0D821536FC900A8E43F /* main.mm in Sources */, 1A255E2920034B0D00069420 /* CCImage.cpp in Sources */, 466BA3B6216C79C7006C15A5 /* DepthStencilStateMTL.mm in Sources */, @@ -1363,6 +1376,7 @@ 468BD2E02154FE66007BCACF /* VertexLayout.cpp in Sources */, 460373DB21363EDE00DC9ED4 /* BasicBackend.cpp in Sources */, 468BD2E12154FE6D007BCACF /* BindGroup.cpp in Sources */, + ED54310621880D080048B076 /* HashAlgorithm.cpp in Sources */, 468BD2DF2154FCB0007BCACF /* BlendStateMTL.mm in Sources */, 1A255E5920034B0D00069420 /* Vec2.cpp in Sources */, 461DD0DB2153773F00A8E43F /* DeviceMTL.mm in Sources */, @@ -1373,6 +1387,7 @@ 1A255E3320034B0D00069420 /* CCDevice-mac.mm in Sources */, 1A255E4720034B0D00069420 /* MathUtil.cpp in Sources */, 1A255E4D20034B0D00069420 /* Mat4.cpp in Sources */, + ED0875D2218BF27900B7F6A4 /* StringUtils.cpp in Sources */, 461DD0ED21538B0100A8E43F /* CommandBuffer.cpp in Sources */, 1A255E5D20034B0D00069420 /* CCAffineTransform.cpp in Sources */, 46486F31217077020078BE0E /* Utils.mm in Sources */, @@ -1382,6 +1397,7 @@ 468BD2F1215A142B007BCACF /* RenderPipelineMTL.mm in Sources */, 467E26232154A3FB0055AD62 /* RenderPassMTL.mm in Sources */, 1A69F1011FF22B0200B224DF /* tinyxml2.cpp in Sources */, + ED2F9F46218FDC40008E6BC2 /* ParticleBackend.cpp in Sources */, 1A255E5520034B0D00069420 /* Vec4.cpp in Sources */, 1A69F1001FF22B0200B224DF /* unzip.cpp in Sources */, 4627246A1FF4E39E000D13BC /* Utils.cpp in Sources */, diff --git a/test/tests/backend/BasicBackend.cpp b/test/tests/backend/BasicBackend.cpp index 3da5daf..0621b6a 100644 --- a/test/tests/backend/BasicBackend.cpp +++ b/test/tests/backend/BasicBackend.cpp @@ -62,9 +62,8 @@ BasicBackend::BasicBackend() )"; auto device = cocos2d::backend::Device::getInstance(); - - auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); cocos2d::backend::RenderPipelineDescriptor renderPipelineDescriptor; renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -73,8 +72,7 @@ BasicBackend::BasicBackend() vertexLayout.setAtrribute("a_position", 0, cocos2d::backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(sizeof(float) * 2, cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - - _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); + _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); _commandBuffer = device->newCommandBuffer(); @@ -85,7 +83,7 @@ BasicBackend::BasicBackend() cocos2d::backend::RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 0.1f); renderPassDescriptor.setClearDepth(1); - _renderPass = device->newRenderPass(renderPassDescriptor); + _renderPass = device->cacheRenderPass(renderPassDescriptor); } BasicBackend::~BasicBackend() diff --git a/test/tests/backend/BlendingBackend.cpp b/test/tests/backend/BlendingBackend.cpp index d6d6dab..ff5796a 100644 --- a/test/tests/backend/BlendingBackend.cpp +++ b/test/tests/backend/BlendingBackend.cpp @@ -66,8 +66,8 @@ namespace auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -87,8 +87,8 @@ namespace blendDescriptorNoBlending.destinationAlphaBlendFactor = backend::BlendFactor::ZERO; auto blendStateNoBlending = device->createBlendState(blendDescriptorNoBlending); renderPipelineDescriptor.setBlendState(blendStateNoBlending); - renderPipelineNoBlending = device->newRenderPipeline(renderPipelineDescriptor); - + renderPipelineNoBlending = device->cacheRenderPipeline(renderPipelineDescriptor); + backend::BlendDescriptor blendDescriptorNormal; blendDescriptorNormal.blendEnabled = true; blendDescriptorNormal.rgbBlendOperation = backend::BlendOperation::ADD; @@ -99,7 +99,7 @@ namespace blendDescriptorNormal.destinationRGBBlendFactor = backend::BlendFactor::ONE; auto blendStateNormal = device->createBlendState(blendDescriptorNormal); renderPipelineDescriptor.setBlendState(blendStateNormal); - renderPipelineNormal = device->newRenderPipeline(renderPipelineDescriptor); + renderPipelineNormal = device->cacheRenderPipeline(renderPipelineDescriptor); backend::BlendDescriptor blendDescriptorAddtive; blendDescriptorAddtive.blendEnabled = true; @@ -111,8 +111,8 @@ namespace blendDescriptorAddtive.destinationAlphaBlendFactor = backend::BlendFactor::ONE; auto blendStateAddtive = device->createBlendState(blendDescriptorAddtive); renderPipelineDescriptor.setBlendState(blendStateAddtive); - renderPipelineAddtive = device->newRenderPipeline(renderPipelineDescriptor); - + renderPipelineAddtive = device->cacheRenderPipeline(renderPipelineDescriptor); + backend::BlendDescriptor blendDescriptorSubstract; blendDescriptorSubstract.blendEnabled = true; blendDescriptorSubstract.rgbBlendOperation = backend::BlendOperation::ADD; @@ -123,7 +123,7 @@ namespace blendDescriptorSubstract.destinationAlphaBlendFactor = backend::BlendFactor::ONE; auto blendStateSubstract = device->createBlendState(blendDescriptorSubstract); renderPipelineDescriptor.setBlendState(blendStateSubstract); - renderPipelineSubstract = device->newRenderPipeline(renderPipelineDescriptor); + renderPipelineSubstract = device->cacheRenderPipeline(renderPipelineDescriptor); backend::BlendDescriptor blendDescriptorMultiply; blendDescriptorMultiply.blendEnabled = true; @@ -135,7 +135,7 @@ namespace blendDescriptorMultiply.destinationAlphaBlendFactor = backend::BlendFactor::ONE; auto blendStateMultiply = device->createBlendState(blendDescriptorMultiply); renderPipelineDescriptor.setBlendState(blendStateMultiply); - renderPipelineMultiply = device->newRenderPipeline(renderPipelineDescriptor); + renderPipelineMultiply = device->cacheRenderPipeline(renderPipelineDescriptor); float vertices[] = { -0.5f, -0.5f, 0, 0, @@ -220,7 +220,7 @@ namespace vertexLayout.setLayout(2 * sizeof(float), cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); + renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); float vertices[] = { -1, 4, @@ -296,7 +296,7 @@ BlendingBackend::BlendingBackend() backend::RenderPassDescriptor renderPassDescriptorBigTriangl; renderPassDescriptorBigTriangl.setClearColor(0.1f, 0.1f, 0.1f, 1.f); renderPassDescriptorBigTriangl.setClearDepth(1); - _renderPassBigTriangle = device->newRenderPass(renderPassDescriptorBigTriangl); + _renderPassBigTriangle = device->cacheRenderPass(renderPassDescriptorBigTriangl); } BlendingBackend::~BlendingBackend() diff --git a/test/tests/backend/BunnyBackend.cpp b/test/tests/backend/BunnyBackend.cpp index 3029aa2..8ca3b69 100644 --- a/test/tests/backend/BunnyBackend.cpp +++ b/test/tests/backend/BunnyBackend.cpp @@ -78,19 +78,19 @@ BunnyBackend::BunnyBackend() depthStencilDescriptor.depthCompareFunction = cocos2d::backend::CompareFunction::LESS; auto depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - - auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + + auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); - - _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); + + _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); // render pass cocos2d::backend::RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 0.1f); renderPassDescriptor.setClearDepth(1.f); - _renderPass = device->newRenderPass(renderPassDescriptor); + _renderPass = device->cacheRenderPass(renderPassDescriptor); // bind group _bindGroup.setUniform("model", _model.m, sizeof(_model.m)); diff --git a/test/tests/backend/DepthTextureBackend.cpp b/test/tests/backend/DepthTextureBackend.cpp index e2d62bf..5297a54 100644 --- a/test/tests/backend/DepthTextureBackend.cpp +++ b/test/tests/backend/DepthTextureBackend.cpp @@ -75,8 +75,8 @@ namespace // render pipeline backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -84,8 +84,7 @@ namespace vertexLayout.setAtrribute("a_position", 0, cocos2d::backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(2 * sizeof(float), cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - - renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); + renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); // vertex buffer float vertices[] = {-1, 4, -1, -1, 4, -1}; @@ -143,8 +142,8 @@ namespace // render pipeline backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -158,8 +157,8 @@ namespace depthStencilDescriptor.depthCompareFunction = backend::CompareFunction::LESS; auto depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - - renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); + renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + renderPipeline->retain(); // vertex buffer @@ -214,18 +213,19 @@ DepthTextureBackend::DepthTextureBackend() backend::RenderPassDescriptor renderPassDescriptorBunny1; renderPassDescriptorBunny1.setClearDepth(1); renderPassDescriptorBunny1.setDepthStencilAttachment(_depthTexture); - _renderPassBunny1 = device->newRenderPass(renderPassDescriptorBunny1); + _renderPassBunny1 = device->cacheRenderPass(renderPassDescriptorBunny1); // render pass 2 - backend::RenderPassDescriptor renderPassDescriptorBunny2; - renderPassDescriptorBunny2.setDepthStencilAttachment(_depthTexture); - _renderPassBunny2 = device->newRenderPass(renderPassDescriptorBunny2); +// backend::RenderPassDescriptor renderPassDescriptorBunny2; +// renderPassDescriptorBunny2.setDepthStencilAttachment(_depthTexture); +//// _renderPassBunny2 = device->newRenderPass(renderPassDescriptorBunny2); +// _renderPassBunny2 = device->cacheRenderPass(renderPassDescriptorBunny2); // render pass BigTriangle backend::RenderPassDescriptor renderPassDescriptorBigTriangle; renderPassDescriptorBigTriangle.setClearColor(0.1f, 0.1f, 0.1f, 1); renderPassDescriptorBigTriangle.setClearDepth(1); - _renderPassBigTriangle = device->newRenderPass(renderPassDescriptorBigTriangle); + _renderPassBigTriangle = device->cacheRenderPass(renderPassDescriptorBigTriangle); _commandBuffer = device->newCommandBuffer(); @@ -240,7 +240,7 @@ DepthTextureBackend::~DepthTextureBackend() CC_SAFE_RELEASE(_depthTexture); CC_SAFE_RELEASE(_renderPassBunny1); - CC_SAFE_RELEASE(_renderPassBunny2); +// CC_SAFE_RELEASE(_renderPassBunny2); CC_SAFE_RELEASE(_renderPassBigTriangle); CC_SAFE_RELEASE(_commandBuffer); } diff --git a/test/tests/backend/GuiProjectionBackend.cpp b/test/tests/backend/GuiProjectionBackend.cpp index c6354f3..b441c0b 100644 --- a/test/tests/backend/GuiProjectionBackend.cpp +++ b/test/tests/backend/GuiProjectionBackend.cpp @@ -66,8 +66,8 @@ GuiProjectionBackend::GuiProjectionBackend() auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->createShaderModule(backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(backend::ShaderStage::FRAGMENT, frag); + auto vs = device->cacheShaderModule(backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -82,7 +82,7 @@ GuiProjectionBackend::GuiProjectionBackend() vertexLayout.setLayout(totalOffset, backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); + _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); _commandBuffer = device->newCommandBuffer(); auto img = new cocos2d::Image(); @@ -126,7 +126,7 @@ GuiProjectionBackend::GuiProjectionBackend() backend::RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 1.f); renderPassDescriptor.setClearDepth(1); - _renderPass = device->newRenderPass(renderPassDescriptor); + _renderPass = device->cacheRenderPass(renderPassDescriptor); } GuiProjectionBackend::~GuiProjectionBackend() diff --git a/test/tests/backend/MultiTexturesBackend.cpp b/test/tests/backend/MultiTexturesBackend.cpp index b2c1566..792b33e 100644 --- a/test/tests/backend/MultiTexturesBackend.cpp +++ b/test/tests/backend/MultiTexturesBackend.cpp @@ -64,8 +64,8 @@ MultiTexturesBackend::MultiTexturesBackend() auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -74,8 +74,7 @@ MultiTexturesBackend::MultiTexturesBackend() vertexLayout.setLayout(2 * sizeof(float), cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); - + _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); float vertices[] = {-1, -1, 1, -1, 1, 1, 1, 1, -1, 1, -1, -1}; _vertexBuffer = device->newBuffer(sizeof(vertices), cocos2d::backend::BufferType::VERTEX, @@ -115,7 +114,7 @@ MultiTexturesBackend::MultiTexturesBackend() backend::RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 1.f); renderPassDescriptor.setClearDepth(1); - _renderPass = device->newRenderPass(renderPassDescriptor); + _renderPass = device->cacheRenderPass(renderPassDescriptor); } MultiTexturesBackend::~MultiTexturesBackend() diff --git a/test/tests/backend/ParticleBackend.cpp b/test/tests/backend/ParticleBackend.cpp index 37dd575..b6bb843 100644 --- a/test/tests/backend/ParticleBackend.cpp +++ b/test/tests/backend/ParticleBackend.cpp @@ -75,8 +75,8 @@ ParticleBackend::ParticleBackend() auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->createShaderModule(backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(backend::ShaderStage::FRAGMENT, frag); + auto vs = device->cacheShaderModule(backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -104,7 +104,7 @@ ParticleBackend::ParticleBackend() blendDescriptorNormal.destinationRGBBlendFactor = backend::BlendFactor::ONE; auto blendStateNormal = device->createBlendState(blendDescriptorNormal); renderPipelineDescriptor.setBlendState(blendStateNormal); - _renderPipelineWithBlend = device->newRenderPipeline(renderPipelineDescriptor); + _renderPipelineWithBlend = device->cacheRenderPipeline(renderPipelineDescriptor); Data imageData; const size_t BUFFER_SIZE = 128 * 128 * 3; @@ -161,10 +161,9 @@ ParticleBackend::ParticleBackend() Mat4::createLookAt(Vec3(30.0f , 20.0f, 30.0f), Vec3(0.0f, 2.5f, 0.0f), Vec3(0.0f, 1.0f, 0.f), &_view); backend::RenderPassDescriptor renderPassDescriptor; - renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 1.f); + renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 0.1f); renderPassDescriptor.setClearDepth(1); - _renderPass = device->newRenderPass(renderPassDescriptor); - + _renderPass = device->cacheRenderPass(renderPassDescriptor); } ParticleBackend::~ParticleBackend() diff --git a/test/tests/backend/PostProcessBackend.cpp b/test/tests/backend/PostProcessBackend.cpp index 5bdb634..91305ee 100644 --- a/test/tests/backend/PostProcessBackend.cpp +++ b/test/tests/backend/PostProcessBackend.cpp @@ -88,16 +88,16 @@ namespace auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->createShaderModule(backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(backend::ShaderStage::FRAGMENT, frag); + auto vs = device->cacheShaderModule(backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); backend::VertexLayout vertexLayout; vertexLayout.setAtrribute("a_position", 0, backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(2 * sizeof(float), backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); - + _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + float vertices[] = {-1, 4, -1, -1, 4, -1}; _vertexBuffer = device->newBuffer(sizeof(vertices), backend::BufferType::VERTEX, @@ -169,8 +169,8 @@ namespace depthStencilDescriptor.depthCompareFunction = backend::CompareFunction::LESS; auto depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); - + _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + _vertexBuffer = device->newBuffer(sizeof(bunny_positions), backend::BufferType::VERTEX, backend::BufferUsage::READ); @@ -224,12 +224,12 @@ PostProcessBackend::PostProcessBackend() renderPassDescriptorBunny.setClearDepth(1); renderPassDescriptorBunny.setColorAttachment(0, _colorTexture); renderPassDescriptorBunny.setDepthStencilAttachment(_depthTexture); - _renderPassBunny = device->newRenderPass(renderPassDescriptorBunny); + _renderPassBunny = device->cacheRenderPass(renderPassDescriptorBunny); backend::RenderPassDescriptor renderPassDescriptorBg; renderPassDescriptorBg.setClearColor(0.1f, 0.1f, 0.1f, 1.f); renderPassDescriptorBg.setClearDepth(1); - _renderPassBg = device->newRenderPass(renderPassDescriptorBg); + _renderPassBg = device->cacheRenderPass(renderPassDescriptorBg); _commandBuffer = device->newCommandBuffer(); diff --git a/test/tests/backend/StencilBackend.cpp b/test/tests/backend/StencilBackend.cpp index 693631d..abfc181 100644 --- a/test/tests/backend/StencilBackend.cpp +++ b/test/tests/backend/StencilBackend.cpp @@ -89,16 +89,16 @@ StencilBackend::StencilBackend() img->release(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); backend::VertexLayout vertexLayout; vertexLayout.setAtrribute("a_position", 0, cocos2d::backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(2 * sizeof(float), cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); - + _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + backend::DepthStencilDescriptor depthStencilDescriptor; depthStencilDescriptor.backFaceStencil.stencilCompareFunction = backend::CompareFunction::NEVER; depthStencilDescriptor.backFaceStencil.readMask = 0xFF; @@ -109,30 +109,30 @@ StencilBackend::StencilBackend() depthStencilDescriptor.frontFaceStencil = depthStencilDescriptor.backFaceStencil; auto depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - _renderPipelineCavasTexture = device->newRenderPipeline(renderPipelineDescriptor); - + _renderPipelineCavasTexture = device->cacheRenderPipeline(renderPipelineDescriptor); + depthStencilDescriptor.backFaceStencil.stencilCompareFunction = backend::CompareFunction::EQUAL; depthStencilDescriptor.backFaceStencil.stencilFailureOperation = backend::StencilOperation::KEEP; depthStencilDescriptor.frontFaceStencil = depthStencilDescriptor.backFaceStencil; depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - _renderPipelineTextureBackAndFront = device->newRenderPipeline(renderPipelineDescriptor); - + _renderPipelineTextureBackAndFront = device->cacheRenderPipeline(renderPipelineDescriptor); + depthStencilDescriptor.frontFaceStencil.stencilCompareFunction = backend::CompareFunction::ALWAYS; depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - _renderPipelineTextureBack = device->newRenderPipeline(renderPipelineDescriptor); - + _renderPipelineTextureBack = device->cacheRenderPipeline(renderPipelineDescriptor); + depthStencilDescriptor.frontFaceStencil.stencilCompareFunction = backend::CompareFunction::EQUAL; depthStencilDescriptor.backFaceStencil.stencilCompareFunction = backend::CompareFunction::ALWAYS; depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - _renderPipelineTextureFront = device->newRenderPipeline(renderPipelineDescriptor); - + _renderPipelineTextureFront = device->cacheRenderPipeline(renderPipelineDescriptor); + backend::RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(1.0f, 0.1f, 0.1f, 1.f); renderPassDescriptor.setClearDepth(1); - _renderPass = device->newRenderPass(renderPassDescriptor); + _renderPass = device->cacheRenderPass(renderPassDescriptor); float vertexBuf[][2] = { {-1, -1}, diff --git a/test/tests/backend/SubImageBackend.cpp b/test/tests/backend/SubImageBackend.cpp index 70ae8fc..27dd9ee 100644 --- a/test/tests/backend/SubImageBackend.cpp +++ b/test/tests/backend/SubImageBackend.cpp @@ -60,8 +60,8 @@ SubImageBackend::SubImageBackend() auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->createShaderModule(backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(backend::ShaderStage::FRAGMENT, frag); + auto vs = device->cacheShaderModule(backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -69,8 +69,8 @@ SubImageBackend::SubImageBackend() vertexLayout.setAtrribute("a_position", 0, backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(2 * sizeof(float), backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); - + _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + backend::TextureDescriptor textureDescriptor; textureDescriptor.width = 128; textureDescriptor.height = 128; diff --git a/test/tests/backend/Texture2DBackend.cpp b/test/tests/backend/Texture2DBackend.cpp index f756afe..accd038 100644 --- a/test/tests/backend/Texture2DBackend.cpp +++ b/test/tests/backend/Texture2DBackend.cpp @@ -117,8 +117,8 @@ Texture2DBackendTest::Texture2DBackendTest() // create render pipeline RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -126,8 +126,8 @@ Texture2DBackendTest::Texture2DBackendTest() vertexLayout.setAtrribute("a_position", 0, cocos2d::backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(2 * sizeof(float), cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); - + _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + _transform0.translate(-0.5f, 0, 0); _transform0.scale(0.5f); _transform1.translate(0.5f, 0, 0); @@ -147,7 +147,7 @@ Texture2DBackendTest::Texture2DBackendTest() RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 0.1f); renderPassDescriptor.setClearDepth(1.f); - _renderPass = device->newRenderPass(renderPassDescriptor); + _renderPass = device->cacheRenderPass(renderPassDescriptor); _commandBuffer = device->newCommandBuffer(); } From b6b62b4c7a193ebc5565e7806f14816c14f1e4b7 Mon Sep 17 00:00:00 2001 From: coulsonwang <> Date: Wed, 7 Nov 2018 13:57:10 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E3=80=90Feature=E3=80=91caching=20for=20?= =?UTF-8?q?renderPipeline,=20test=20succeed=20on=20iOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/opengl/BlendStateGL.cpp | 3 ++- src/backend/opengl/DeviceGL.cpp | 13 +++++++++++++ src/backend/opengl/DeviceGL.h | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/backend/opengl/BlendStateGL.cpp b/src/backend/opengl/BlendStateGL.cpp index 0673e88..683c828 100644 --- a/src/backend/opengl/BlendStateGL.cpp +++ b/src/backend/opengl/BlendStateGL.cpp @@ -79,7 +79,8 @@ void BlendStateGL::reset() } BlendStateGL::BlendStateGL(const BlendDescriptor& descriptor) -: _blendEnabled(descriptor.blendEnabled) +: BlendState(descriptor) +, _blendEnabled(descriptor.blendEnabled) , _rgbBlendOperation(toGLBlendOperation(descriptor.rgbBlendOperation)) , _alphaBlendOperation(toGLBlendOperation(descriptor.alphaBlendOperation)) , _sourceRGBBlendFactor(toGLBlendFactor(descriptor.sourceRGBBlendFactor)) diff --git a/src/backend/opengl/DeviceGL.cpp b/src/backend/opengl/DeviceGL.cpp index e651d20..88f8120 100644 --- a/src/backend/opengl/DeviceGL.cpp +++ b/src/backend/opengl/DeviceGL.cpp @@ -70,4 +70,17 @@ RenderPipeline* DeviceGL::newRenderPipeline(const RenderPipelineDescriptor& desc return new (std::nothrow) RenderPipelineGL(descriptor); } +RenderPass* DeviceGL::cacheRenderPass(const RenderPassDescriptor& descriptor) +{ + return newRenderPass(descriptor); +} +ShaderModule* DeviceGL::cacheShaderModule(ShaderStage stage, const std::string& source) +{ + return createShaderModule(stage, source); +} +RenderPipeline* DeviceGL::cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) +{ + return newRenderPipeline(descriptor); +} + CC_BACKEND_END diff --git a/src/backend/opengl/DeviceGL.h b/src/backend/opengl/DeviceGL.h index 30bcaa5..a911430 100644 --- a/src/backend/opengl/DeviceGL.h +++ b/src/backend/opengl/DeviceGL.h @@ -13,6 +13,9 @@ class DeviceGL : public Device virtual DepthStencilState* createDepthStencilState(const DepthStencilDescriptor& descriptor) override; virtual BlendState* createBlendState(const BlendDescriptor& descriptor) override; virtual RenderPipeline* newRenderPipeline(const RenderPipelineDescriptor& descriptor) override; + virtual RenderPass* cacheRenderPass(const RenderPassDescriptor& descriptor) override; + virtual ShaderModule* cacheShaderModule(ShaderStage stage, const std::string& source) override; + virtual RenderPipeline* cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) override; }; CC_BACKEND_END From 07c6cca8ce1fe4436d26927b51dd21438505cdc5 Mon Sep 17 00:00:00 2001 From: coulsonwang <> Date: Mon, 12 Nov 2018 21:23:20 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E3=80=90Feature=E3=80=91only=20cached=20?= =?UTF-8?q?in=20metal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/Device.h | 6 +- src/backend/RenderPassDescriptor.cpp | 2 +- src/backend/metal/DeviceMTL.h | 9 +- src/backend/metal/DeviceMTL.mm | 118 ++++++++------------ src/backend/opengl/DeviceGL.cpp | 14 --- src/backend/opengl/DeviceGL.h | 3 - test/tests/backend/BasicBackend.cpp | 8 +- test/tests/backend/BlendingBackend.cpp | 18 +-- test/tests/backend/BunnyBackend.cpp | 8 +- test/tests/backend/DepthTextureBackend.cpp | 16 +-- test/tests/backend/GuiProjectionBackend.cpp | 8 +- test/tests/backend/MultiTexturesBackend.cpp | 8 +- test/tests/backend/ParticleBackend.cpp | 8 +- test/tests/backend/PostProcessBackend.cpp | 12 +- test/tests/backend/StencilBackend.cpp | 16 +-- test/tests/backend/SubImageBackend.cpp | 6 +- test/tests/backend/Texture2DBackend.cpp | 8 +- 17 files changed, 112 insertions(+), 156 deletions(-) diff --git a/src/backend/Device.h b/src/backend/Device.h index 550121a..71f17a6 100644 --- a/src/backend/Device.h +++ b/src/backend/Device.h @@ -34,13 +34,13 @@ class Device : public cocos2d::Ref // Create a render pass, not auto released. virtual RenderPass* newRenderPass(const RenderPassDescriptor& descriptor) = 0; // Cache RenderPass for reuse - virtual RenderPass* cacheRenderPass(const RenderPassDescriptor& descriptor) = 0; +// virtual RenderPass* cacheRenderPass(const RenderPassDescriptor& descriptor) = 0; // Create a texture, not auto released. virtual Texture* newTexture(const TextureDescriptor& descriptor) = 0; // Create a auto released shader module. virtual ShaderModule* createShaderModule(ShaderStage stage, const std::string& source) = 0; // Cache ShaderModule for reuse - virtual ShaderModule* cacheShaderModule(ShaderStage stage, const std::string& source) = 0; +// virtual ShaderModule* cacheShaderModule(ShaderStage stage, const std::string& source) = 0; // Create a auto released depth stencil state. virtual DepthStencilState* createDepthStencilState(const DepthStencilDescriptor& descriptor) = 0; // Create a auto released blend state. @@ -48,7 +48,7 @@ class Device : public cocos2d::Ref // Create a render pipeline, not auto released. virtual RenderPipeline* newRenderPipeline(const RenderPipelineDescriptor& descriptor) = 0; // Cache RenderPipeline for reuse - virtual RenderPipeline* cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) = 0; +// virtual RenderPipeline* cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) = 0; private: static Device* _instance; }; diff --git a/src/backend/RenderPassDescriptor.cpp b/src/backend/RenderPassDescriptor.cpp index 404c884..7d98557 100644 --- a/src/backend/RenderPassDescriptor.cpp +++ b/src/backend/RenderPassDescriptor.cpp @@ -93,7 +93,7 @@ bool RenderPassDepthStencilAttachment::operator==(const RenderPassDepthStencilAt return false; if(texture && renderAttachment.texture) - return texture->getTextureHashCode() == renderAttachment.texture->getTextureHashCode(); + return texture->getTextureHashCode()?texture->getTextureHashCode() == renderAttachment.texture->getTextureHashCode():false; else if(!texture && !(renderAttachment.texture)) return true; diff --git a/src/backend/metal/DeviceMTL.h b/src/backend/metal/DeviceMTL.h index 8dafb8c..f61dc26 100644 --- a/src/backend/metal/DeviceMTL.h +++ b/src/backend/metal/DeviceMTL.h @@ -24,13 +24,10 @@ class DeviceMTL : public Device virtual Buffer* newBuffer(uint32_t size, BufferType type, BufferUsage usage) override; virtual RenderPass* newRenderPass(const RenderPassDescriptor& descriptor) override; virtual Texture* newTexture(const TextureDescriptor& descriptor) override; - virtual RenderPass* cacheRenderPass(const RenderPassDescriptor& descriptor) override; virtual ShaderModule* createShaderModule(ShaderStage stage, const std::string& source) override; - virtual ShaderModule* cacheShaderModule(ShaderStage stage, const std::string& source) override; virtual DepthStencilState* createDepthStencilState(const DepthStencilDescriptor& descriptor) override; virtual BlendState* createBlendState(const BlendDescriptor& descriptor) override; virtual RenderPipeline* newRenderPipeline(const RenderPipelineDescriptor& descriptor) override; - virtual RenderPipeline* cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) override; inline id getMTLDevice() const { return _mtlDevice; } inline id getMTLCommandQueue() const { return _mtlCommandQueue; } @@ -46,9 +43,9 @@ class DeviceMTL : public Device id _mtlDevice = nil; id _mtlCommandQueue = nil; - std::vector _cacheRenderPass; - std::vector _cacheShaderModule; - std::vector _cacheRenderPipeline; + std::vector _cachedRenderPass; + std::vector _cachedShaderModule; + std::vector _cachedRenderPipeline; }; CC_BACKEND_END diff --git a/src/backend/metal/DeviceMTL.mm b/src/backend/metal/DeviceMTL.mm index 87b5943..2d3c542 100644 --- a/src/backend/metal/DeviceMTL.mm +++ b/src/backend/metal/DeviceMTL.mm @@ -49,17 +49,17 @@ DeviceMTL::~DeviceMTL() { - for(auto& renderPass : _cacheRenderPass) + for(auto& renderPass : _cachedRenderPass) CC_SAFE_RELEASE(renderPass); - _cacheRenderPass.clear(); + _cachedRenderPass.clear(); - for(auto& renderPipeline : _cacheRenderPipeline) + for(auto& renderPipeline : _cachedRenderPipeline) CC_SAFE_RELEASE(renderPipeline); - _cacheRenderPipeline.clear(); + _cachedRenderPipeline.clear(); - for(auto& shaderModule : _cacheShaderModule) + for(auto& shaderModule : _cachedShaderModule) CC_SAFE_RELEASE(shaderModule); - _cacheShaderModule.clear(); + _cachedShaderModule.clear(); } CommandBuffer* DeviceMTL::newCommandBuffer() @@ -79,52 +79,53 @@ RenderPass* DeviceMTL::newRenderPass(const RenderPassDescriptor& descriptor) { - return new (std::nothrow) RenderPassMTL(_mtlDevice, descriptor); + auto posIndex = findRenderPassInCache(descriptor); + if(posIndex != -1) + { + _cachedRenderPass[posIndex]->retain(); + return _cachedRenderPass[posIndex]; + } + else + { + auto renderPass = new (std::nothrow) RenderPassMTL(_mtlDevice, descriptor); + renderPass->retain(); + _cachedRenderPass.push_back(renderPass); + return renderPass; + } } size_t DeviceMTL::findRenderPassInCache(const RenderPassDescriptor& descriptor) { - for(std::vector::const_iterator iter = _cacheRenderPass.begin(); iter != _cacheRenderPass.end(); iter++) + for(std::vector::const_iterator iter = _cachedRenderPass.begin(); iter != _cachedRenderPass.end(); iter++) { bool bFound = (*iter)->Find(descriptor); if(bFound) { - return iter - _cacheRenderPass.begin(); + return iter - _cachedRenderPass.begin(); } } return -1; } -RenderPass* DeviceMTL::cacheRenderPass(const RenderPassDescriptor& descriptor) +ShaderModule* DeviceMTL::createShaderModule(ShaderStage stage, const std::string& source) { - auto posIndex = findRenderPassInCache(descriptor); - if(posIndex != -1) - { - _cacheRenderPass[posIndex]->retain(); - return _cacheRenderPass[posIndex]; - } - else + auto posIndex = findShaderModuleInCache(stage, source); + if (posIndex != -1) { - RenderPass* renderPass = newRenderPass(descriptor); - renderPass->retain(); - _cacheRenderPass.push_back(renderPass); - return renderPass; + _cachedShaderModule[posIndex]->retain(); + return _cachedShaderModule[posIndex]; } -} -ShaderModule* DeviceMTL::createShaderModule(ShaderStage stage, const std::string& source) -{ - auto ret = new (std::nothrow) ShaderModuleMTL(_mtlDevice, stage, source); - if (ret) - ret->autorelease(); - - return ret; + auto shaderModule = new (std::nothrow) ShaderModuleMTL(_mtlDevice, stage, source); + shaderModule->retain(); + _cachedShaderModule.push_back(shaderModule); + return shaderModule; } size_t DeviceMTL::findShaderModuleInCache(const ShaderStage& stage, const std::string& source) { - for(std::vector::const_iterator iter = _cacheShaderModule.begin(); iter != _cacheShaderModule.end(); iter++) + for(std::vector::const_iterator iter = _cachedShaderModule.begin(); iter != _cachedShaderModule.end(); iter++) { ShaderModuleMTL* shader = static_cast(*iter); if(shader->getShaderStage() != stage) @@ -132,29 +133,12 @@ bool bFound = shader->Find(source); if(bFound) { - return iter - _cacheShaderModule.begin(); + return iter - _cachedShaderModule.begin(); } } return -1; } -ShaderModule* DeviceMTL::cacheShaderModule(ShaderStage stage, const std::string& source) -{ - auto posIndex = findShaderModuleInCache(stage, source); - if (posIndex != -1) - { - _cacheShaderModule[posIndex]->retain(); - return _cacheShaderModule[posIndex]; - } - else - { - ShaderModule* shaderModule = createShaderModule(stage, source); - shaderModule->retain(); - _cacheShaderModule.push_back(shaderModule); - return shaderModule; - } -} - DepthStencilState* DeviceMTL::createDepthStencilState(const DepthStencilDescriptor& descriptor) { auto ret = new (std::nothrow) DepthStencilStateMTL(_mtlDevice, descriptor); @@ -175,40 +159,32 @@ RenderPipeline* DeviceMTL::newRenderPipeline(const RenderPipelineDescriptor& descriptor) { - return new (std::nothrow) RenderPipelineMTL(_mtlDevice, descriptor); + auto posIndex = findRenderPipelineInCache(descriptor); + if (posIndex != -1) + { + _cachedRenderPipeline[posIndex]->retain(); + return _cachedRenderPipeline[posIndex]; + } + else + { + auto renderPipeline = new (std::nothrow) RenderPipelineMTL(_mtlDevice, descriptor); + renderPipeline->retain(); + _cachedRenderPipeline.push_back(renderPipeline); + return renderPipeline; + } } size_t DeviceMTL::findRenderPipelineInCache(const RenderPipelineDescriptor& descriptor) { - for(std::vector::const_iterator iter = _cacheRenderPipeline.begin(); iter != _cacheRenderPipeline.end(); iter++) + for(std::vector::const_iterator iter = _cachedRenderPipeline.begin(); iter != _cachedRenderPipeline.end(); iter++) { RenderPipelineMTL* renderPipeline = static_cast(*iter); if(renderPipeline->getHash() == renderPipeline->createHash(descriptor)) { - return iter - _cacheRenderPipeline.begin(); + return iter - _cachedRenderPipeline.begin(); } } return -1; } -RenderPipeline* DeviceMTL::cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) -{ - auto posIndex = findRenderPipelineInCache(descriptor); - if (posIndex != -1) - { - _cacheRenderPipeline[posIndex]->retain(); - return _cacheRenderPipeline[posIndex]; - } - else - { - RenderPipeline* renderPipeline = newRenderPipeline(descriptor); - renderPipeline->retain(); - _cacheRenderPipeline.push_back(renderPipeline); -// _cacheRenderPipeline[_cacheRenderPipeline.size()] = renderPipeline; -// _cacheRenderPipelineDescriptor.push_back(descriptor._hash); - - return renderPipeline; - } - -} CC_BACKEND_END diff --git a/src/backend/opengl/DeviceGL.cpp b/src/backend/opengl/DeviceGL.cpp index 88f8120..197866f 100644 --- a/src/backend/opengl/DeviceGL.cpp +++ b/src/backend/opengl/DeviceGL.cpp @@ -69,18 +69,4 @@ RenderPipeline* DeviceGL::newRenderPipeline(const RenderPipelineDescriptor& desc { return new (std::nothrow) RenderPipelineGL(descriptor); } - -RenderPass* DeviceGL::cacheRenderPass(const RenderPassDescriptor& descriptor) -{ - return newRenderPass(descriptor); -} -ShaderModule* DeviceGL::cacheShaderModule(ShaderStage stage, const std::string& source) -{ - return createShaderModule(stage, source); -} -RenderPipeline* DeviceGL::cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) -{ - return newRenderPipeline(descriptor); -} - CC_BACKEND_END diff --git a/src/backend/opengl/DeviceGL.h b/src/backend/opengl/DeviceGL.h index a911430..30bcaa5 100644 --- a/src/backend/opengl/DeviceGL.h +++ b/src/backend/opengl/DeviceGL.h @@ -13,9 +13,6 @@ class DeviceGL : public Device virtual DepthStencilState* createDepthStencilState(const DepthStencilDescriptor& descriptor) override; virtual BlendState* createBlendState(const BlendDescriptor& descriptor) override; virtual RenderPipeline* newRenderPipeline(const RenderPipelineDescriptor& descriptor) override; - virtual RenderPass* cacheRenderPass(const RenderPassDescriptor& descriptor) override; - virtual ShaderModule* cacheShaderModule(ShaderStage stage, const std::string& source) override; - virtual RenderPipeline* cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) override; }; CC_BACKEND_END diff --git a/test/tests/backend/BasicBackend.cpp b/test/tests/backend/BasicBackend.cpp index 0621b6a..f73b745 100644 --- a/test/tests/backend/BasicBackend.cpp +++ b/test/tests/backend/BasicBackend.cpp @@ -62,8 +62,8 @@ BasicBackend::BasicBackend() )"; auto device = cocos2d::backend::Device::getInstance(); - auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); cocos2d::backend::RenderPipelineDescriptor renderPipelineDescriptor; renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -72,7 +72,7 @@ BasicBackend::BasicBackend() vertexLayout.setAtrribute("a_position", 0, cocos2d::backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(sizeof(float) * 2, cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); _commandBuffer = device->newCommandBuffer(); @@ -83,7 +83,7 @@ BasicBackend::BasicBackend() cocos2d::backend::RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 0.1f); renderPassDescriptor.setClearDepth(1); - _renderPass = device->cacheRenderPass(renderPassDescriptor); + _renderPass = device->newRenderPass(renderPassDescriptor); } BasicBackend::~BasicBackend() diff --git a/test/tests/backend/BlendingBackend.cpp b/test/tests/backend/BlendingBackend.cpp index ff5796a..7ee6a20 100644 --- a/test/tests/backend/BlendingBackend.cpp +++ b/test/tests/backend/BlendingBackend.cpp @@ -66,8 +66,8 @@ namespace auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -87,7 +87,7 @@ namespace blendDescriptorNoBlending.destinationAlphaBlendFactor = backend::BlendFactor::ZERO; auto blendStateNoBlending = device->createBlendState(blendDescriptorNoBlending); renderPipelineDescriptor.setBlendState(blendStateNoBlending); - renderPipelineNoBlending = device->cacheRenderPipeline(renderPipelineDescriptor); + renderPipelineNoBlending = device->newRenderPipeline(renderPipelineDescriptor); backend::BlendDescriptor blendDescriptorNormal; blendDescriptorNormal.blendEnabled = true; @@ -99,7 +99,7 @@ namespace blendDescriptorNormal.destinationRGBBlendFactor = backend::BlendFactor::ONE; auto blendStateNormal = device->createBlendState(blendDescriptorNormal); renderPipelineDescriptor.setBlendState(blendStateNormal); - renderPipelineNormal = device->cacheRenderPipeline(renderPipelineDescriptor); + renderPipelineNormal = device->newRenderPipeline(renderPipelineDescriptor); backend::BlendDescriptor blendDescriptorAddtive; blendDescriptorAddtive.blendEnabled = true; @@ -111,7 +111,7 @@ namespace blendDescriptorAddtive.destinationAlphaBlendFactor = backend::BlendFactor::ONE; auto blendStateAddtive = device->createBlendState(blendDescriptorAddtive); renderPipelineDescriptor.setBlendState(blendStateAddtive); - renderPipelineAddtive = device->cacheRenderPipeline(renderPipelineDescriptor); + renderPipelineAddtive = device->newRenderPipeline(renderPipelineDescriptor); backend::BlendDescriptor blendDescriptorSubstract; blendDescriptorSubstract.blendEnabled = true; @@ -123,7 +123,7 @@ namespace blendDescriptorSubstract.destinationAlphaBlendFactor = backend::BlendFactor::ONE; auto blendStateSubstract = device->createBlendState(blendDescriptorSubstract); renderPipelineDescriptor.setBlendState(blendStateSubstract); - renderPipelineSubstract = device->cacheRenderPipeline(renderPipelineDescriptor); + renderPipelineSubstract = device->newRenderPipeline(renderPipelineDescriptor); backend::BlendDescriptor blendDescriptorMultiply; blendDescriptorMultiply.blendEnabled = true; @@ -135,7 +135,7 @@ namespace blendDescriptorMultiply.destinationAlphaBlendFactor = backend::BlendFactor::ONE; auto blendStateMultiply = device->createBlendState(blendDescriptorMultiply); renderPipelineDescriptor.setBlendState(blendStateMultiply); - renderPipelineMultiply = device->cacheRenderPipeline(renderPipelineDescriptor); + renderPipelineMultiply = device->newRenderPipeline(renderPipelineDescriptor); float vertices[] = { -0.5f, -0.5f, 0, 0, @@ -220,7 +220,7 @@ namespace vertexLayout.setLayout(2 * sizeof(float), cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); float vertices[] = { -1, 4, @@ -296,7 +296,7 @@ BlendingBackend::BlendingBackend() backend::RenderPassDescriptor renderPassDescriptorBigTriangl; renderPassDescriptorBigTriangl.setClearColor(0.1f, 0.1f, 0.1f, 1.f); renderPassDescriptorBigTriangl.setClearDepth(1); - _renderPassBigTriangle = device->cacheRenderPass(renderPassDescriptorBigTriangl); + _renderPassBigTriangle = device->newRenderPass(renderPassDescriptorBigTriangl); } BlendingBackend::~BlendingBackend() diff --git a/test/tests/backend/BunnyBackend.cpp b/test/tests/backend/BunnyBackend.cpp index 8ca3b69..c3782c6 100644 --- a/test/tests/backend/BunnyBackend.cpp +++ b/test/tests/backend/BunnyBackend.cpp @@ -79,18 +79,18 @@ BunnyBackend::BunnyBackend() auto depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); - _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); // render pass cocos2d::backend::RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 0.1f); renderPassDescriptor.setClearDepth(1.f); - _renderPass = device->cacheRenderPass(renderPassDescriptor); + _renderPass = device->newRenderPass(renderPassDescriptor); // bind group _bindGroup.setUniform("model", _model.m, sizeof(_model.m)); diff --git a/test/tests/backend/DepthTextureBackend.cpp b/test/tests/backend/DepthTextureBackend.cpp index 5297a54..5701f1b 100644 --- a/test/tests/backend/DepthTextureBackend.cpp +++ b/test/tests/backend/DepthTextureBackend.cpp @@ -75,8 +75,8 @@ namespace // render pipeline backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -84,7 +84,7 @@ namespace vertexLayout.setAtrribute("a_position", 0, cocos2d::backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(2 * sizeof(float), cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); // vertex buffer float vertices[] = {-1, 4, -1, -1, 4, -1}; @@ -142,8 +142,8 @@ namespace // render pipeline backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -157,7 +157,7 @@ namespace depthStencilDescriptor.depthCompareFunction = backend::CompareFunction::LESS; auto depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); renderPipeline->retain(); @@ -213,7 +213,7 @@ DepthTextureBackend::DepthTextureBackend() backend::RenderPassDescriptor renderPassDescriptorBunny1; renderPassDescriptorBunny1.setClearDepth(1); renderPassDescriptorBunny1.setDepthStencilAttachment(_depthTexture); - _renderPassBunny1 = device->cacheRenderPass(renderPassDescriptorBunny1); + _renderPassBunny1 = device->newRenderPass(renderPassDescriptorBunny1); // render pass 2 // backend::RenderPassDescriptor renderPassDescriptorBunny2; @@ -225,7 +225,7 @@ DepthTextureBackend::DepthTextureBackend() backend::RenderPassDescriptor renderPassDescriptorBigTriangle; renderPassDescriptorBigTriangle.setClearColor(0.1f, 0.1f, 0.1f, 1); renderPassDescriptorBigTriangle.setClearDepth(1); - _renderPassBigTriangle = device->cacheRenderPass(renderPassDescriptorBigTriangle); + _renderPassBigTriangle = device->newRenderPass(renderPassDescriptorBigTriangle); _commandBuffer = device->newCommandBuffer(); diff --git a/test/tests/backend/GuiProjectionBackend.cpp b/test/tests/backend/GuiProjectionBackend.cpp index b441c0b..c6354f3 100644 --- a/test/tests/backend/GuiProjectionBackend.cpp +++ b/test/tests/backend/GuiProjectionBackend.cpp @@ -66,8 +66,8 @@ GuiProjectionBackend::GuiProjectionBackend() auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->cacheShaderModule(backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -82,7 +82,7 @@ GuiProjectionBackend::GuiProjectionBackend() vertexLayout.setLayout(totalOffset, backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); _commandBuffer = device->newCommandBuffer(); auto img = new cocos2d::Image(); @@ -126,7 +126,7 @@ GuiProjectionBackend::GuiProjectionBackend() backend::RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 1.f); renderPassDescriptor.setClearDepth(1); - _renderPass = device->cacheRenderPass(renderPassDescriptor); + _renderPass = device->newRenderPass(renderPassDescriptor); } GuiProjectionBackend::~GuiProjectionBackend() diff --git a/test/tests/backend/MultiTexturesBackend.cpp b/test/tests/backend/MultiTexturesBackend.cpp index 792b33e..cc69b57 100644 --- a/test/tests/backend/MultiTexturesBackend.cpp +++ b/test/tests/backend/MultiTexturesBackend.cpp @@ -64,8 +64,8 @@ MultiTexturesBackend::MultiTexturesBackend() auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -74,7 +74,7 @@ MultiTexturesBackend::MultiTexturesBackend() vertexLayout.setLayout(2 * sizeof(float), cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); float vertices[] = {-1, -1, 1, -1, 1, 1, 1, 1, -1, 1, -1, -1}; _vertexBuffer = device->newBuffer(sizeof(vertices), cocos2d::backend::BufferType::VERTEX, @@ -114,7 +114,7 @@ MultiTexturesBackend::MultiTexturesBackend() backend::RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 1.f); renderPassDescriptor.setClearDepth(1); - _renderPass = device->cacheRenderPass(renderPassDescriptor); + _renderPass = device->newRenderPass(renderPassDescriptor); } MultiTexturesBackend::~MultiTexturesBackend() diff --git a/test/tests/backend/ParticleBackend.cpp b/test/tests/backend/ParticleBackend.cpp index b6bb843..8589b62 100644 --- a/test/tests/backend/ParticleBackend.cpp +++ b/test/tests/backend/ParticleBackend.cpp @@ -75,8 +75,8 @@ ParticleBackend::ParticleBackend() auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->cacheShaderModule(backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -104,7 +104,7 @@ ParticleBackend::ParticleBackend() blendDescriptorNormal.destinationRGBBlendFactor = backend::BlendFactor::ONE; auto blendStateNormal = device->createBlendState(blendDescriptorNormal); renderPipelineDescriptor.setBlendState(blendStateNormal); - _renderPipelineWithBlend = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipelineWithBlend = device->newRenderPipeline(renderPipelineDescriptor); Data imageData; const size_t BUFFER_SIZE = 128 * 128 * 3; @@ -163,7 +163,7 @@ ParticleBackend::ParticleBackend() backend::RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 0.1f); renderPassDescriptor.setClearDepth(1); - _renderPass = device->cacheRenderPass(renderPassDescriptor); + _renderPass = device->newRenderPass(renderPassDescriptor); } ParticleBackend::~ParticleBackend() diff --git a/test/tests/backend/PostProcessBackend.cpp b/test/tests/backend/PostProcessBackend.cpp index 91305ee..2da44f1 100644 --- a/test/tests/backend/PostProcessBackend.cpp +++ b/test/tests/backend/PostProcessBackend.cpp @@ -88,15 +88,15 @@ namespace auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->cacheShaderModule(backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); backend::VertexLayout vertexLayout; vertexLayout.setAtrribute("a_position", 0, backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(2 * sizeof(float), backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); float vertices[] = {-1, 4, -1, -1, 4, -1}; _vertexBuffer = device->newBuffer(sizeof(vertices), @@ -169,7 +169,7 @@ namespace depthStencilDescriptor.depthCompareFunction = backend::CompareFunction::LESS; auto depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); _vertexBuffer = device->newBuffer(sizeof(bunny_positions), backend::BufferType::VERTEX, @@ -224,12 +224,12 @@ PostProcessBackend::PostProcessBackend() renderPassDescriptorBunny.setClearDepth(1); renderPassDescriptorBunny.setColorAttachment(0, _colorTexture); renderPassDescriptorBunny.setDepthStencilAttachment(_depthTexture); - _renderPassBunny = device->cacheRenderPass(renderPassDescriptorBunny); + _renderPassBunny = device->newRenderPass(renderPassDescriptorBunny); backend::RenderPassDescriptor renderPassDescriptorBg; renderPassDescriptorBg.setClearColor(0.1f, 0.1f, 0.1f, 1.f); renderPassDescriptorBg.setClearDepth(1); - _renderPassBg = device->cacheRenderPass(renderPassDescriptorBg); + _renderPassBg = device->newRenderPass(renderPassDescriptorBg); _commandBuffer = device->newCommandBuffer(); diff --git a/test/tests/backend/StencilBackend.cpp b/test/tests/backend/StencilBackend.cpp index abfc181..add07ad 100644 --- a/test/tests/backend/StencilBackend.cpp +++ b/test/tests/backend/StencilBackend.cpp @@ -89,15 +89,15 @@ StencilBackend::StencilBackend() img->release(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); backend::VertexLayout vertexLayout; vertexLayout.setAtrribute("a_position", 0, cocos2d::backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(2 * sizeof(float), cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); backend::DepthStencilDescriptor depthStencilDescriptor; depthStencilDescriptor.backFaceStencil.stencilCompareFunction = backend::CompareFunction::NEVER; @@ -109,30 +109,30 @@ StencilBackend::StencilBackend() depthStencilDescriptor.frontFaceStencil = depthStencilDescriptor.backFaceStencil; auto depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - _renderPipelineCavasTexture = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipelineCavasTexture = device->newRenderPipeline(renderPipelineDescriptor); depthStencilDescriptor.backFaceStencil.stencilCompareFunction = backend::CompareFunction::EQUAL; depthStencilDescriptor.backFaceStencil.stencilFailureOperation = backend::StencilOperation::KEEP; depthStencilDescriptor.frontFaceStencil = depthStencilDescriptor.backFaceStencil; depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - _renderPipelineTextureBackAndFront = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipelineTextureBackAndFront = device->newRenderPipeline(renderPipelineDescriptor); depthStencilDescriptor.frontFaceStencil.stencilCompareFunction = backend::CompareFunction::ALWAYS; depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - _renderPipelineTextureBack = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipelineTextureBack = device->newRenderPipeline(renderPipelineDescriptor); depthStencilDescriptor.frontFaceStencil.stencilCompareFunction = backend::CompareFunction::EQUAL; depthStencilDescriptor.backFaceStencil.stencilCompareFunction = backend::CompareFunction::ALWAYS; depthStencilState = device->createDepthStencilState(depthStencilDescriptor); renderPipelineDescriptor.setDepthStencilState(depthStencilState); - _renderPipelineTextureFront = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipelineTextureFront = device->newRenderPipeline(renderPipelineDescriptor); backend::RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(1.0f, 0.1f, 0.1f, 1.f); renderPassDescriptor.setClearDepth(1); - _renderPass = device->cacheRenderPass(renderPassDescriptor); + _renderPass = device->newRenderPass(renderPassDescriptor); float vertexBuf[][2] = { {-1, -1}, diff --git a/test/tests/backend/SubImageBackend.cpp b/test/tests/backend/SubImageBackend.cpp index 27dd9ee..8b36e0a 100644 --- a/test/tests/backend/SubImageBackend.cpp +++ b/test/tests/backend/SubImageBackend.cpp @@ -60,8 +60,8 @@ SubImageBackend::SubImageBackend() auto device = backend::Device::getInstance(); backend::RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->cacheShaderModule(backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -69,7 +69,7 @@ SubImageBackend::SubImageBackend() vertexLayout.setAtrribute("a_position", 0, backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(2 * sizeof(float), backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); backend::TextureDescriptor textureDescriptor; textureDescriptor.width = 128; diff --git a/test/tests/backend/Texture2DBackend.cpp b/test/tests/backend/Texture2DBackend.cpp index accd038..d15d31b 100644 --- a/test/tests/backend/Texture2DBackend.cpp +++ b/test/tests/backend/Texture2DBackend.cpp @@ -117,8 +117,8 @@ Texture2DBackendTest::Texture2DBackendTest() // create render pipeline RenderPipelineDescriptor renderPipelineDescriptor; - auto vs = device->cacheShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); - auto fs = device->cacheShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); + auto vs = device->createShaderModule(cocos2d::backend::ShaderStage::VERTEX, vert); + auto fs = device->createShaderModule(cocos2d::backend::ShaderStage::FRAGMENT, frag); renderPipelineDescriptor.setVertexShaderModule(vs); renderPipelineDescriptor.setFragmentShaderModule(fs); @@ -126,7 +126,7 @@ Texture2DBackendTest::Texture2DBackendTest() vertexLayout.setAtrribute("a_position", 0, cocos2d::backend::VertexFormat::FLOAT_R32G32, 0); vertexLayout.setLayout(2 * sizeof(float), cocos2d::backend::VertexStepMode::VERTEX); renderPipelineDescriptor.setVertexLayout(0, vertexLayout); - _renderPipeline = device->cacheRenderPipeline(renderPipelineDescriptor); + _renderPipeline = device->newRenderPipeline(renderPipelineDescriptor); _transform0.translate(-0.5f, 0, 0); _transform0.scale(0.5f); @@ -147,7 +147,7 @@ Texture2DBackendTest::Texture2DBackendTest() RenderPassDescriptor renderPassDescriptor; renderPassDescriptor.setClearColor(0.1f, 0.1f, 0.1f, 0.1f); renderPassDescriptor.setClearDepth(1.f); - _renderPass = device->cacheRenderPass(renderPassDescriptor); + _renderPass = device->newRenderPass(renderPassDescriptor); _commandBuffer = device->newCommandBuffer(); } From 0bc0c38ee0bd61080a23764c178ff335e8b56633 Mon Sep 17 00:00:00 2001 From: coulsonwang <> Date: Mon, 12 Nov 2018 21:40:52 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E3=80=90Feature=E3=80=91modify=20non-sta?= =?UTF-8?q?ndard=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/BlendState.cpp | 2 +- src/backend/BlendState.h | 1 + src/backend/StringUtils.cpp | 2 +- src/backend/{StringUtils.hpp => StringUtils.h} | 0 src/backend/Texture.cpp | 5 +++-- src/backend/metal/RenderPipelineMTL.mm | 2 +- test/Test.xcodeproj/project.pbxproj | 4 ++-- 7 files changed, 9 insertions(+), 7 deletions(-) rename src/backend/{StringUtils.hpp => StringUtils.h} (100%) diff --git a/src/backend/BlendState.cpp b/src/backend/BlendState.cpp index 6d7cee2..69ded1f 100644 --- a/src/backend/BlendState.cpp +++ b/src/backend/BlendState.cpp @@ -2,7 +2,7 @@ CC_BACKEND_BEGIN BlendState::BlendState(const BlendDescriptor& descriptor) +: _blendDescriptor(descriptor) { - _blendDescriptor = descriptor; } CC_BACKEND_END diff --git a/src/backend/BlendState.h b/src/backend/BlendState.h index 0c1029e..61110fa 100644 --- a/src/backend/BlendState.h +++ b/src/backend/BlendState.h @@ -26,6 +26,7 @@ class BlendState : public cocos2d::Ref protected: virtual ~BlendState() = default; BlendState(const BlendDescriptor& descriptor); + BlendDescriptor _blendDescriptor; }; diff --git a/src/backend/StringUtils.cpp b/src/backend/StringUtils.cpp index 2a0a479..84e7b34 100644 --- a/src/backend/StringUtils.cpp +++ b/src/backend/StringUtils.cpp @@ -6,7 +6,7 @@ // Copyright © 2018 cocos. All rights reserved. // -#include "StringUtils.hpp" +#include "StringUtils.h" CC_BACKEND_BEGIN diff --git a/src/backend/StringUtils.hpp b/src/backend/StringUtils.h similarity index 100% rename from src/backend/StringUtils.hpp rename to src/backend/StringUtils.h diff --git a/src/backend/Texture.cpp b/src/backend/Texture.cpp index e399633..79beedd 100644 --- a/src/backend/Texture.cpp +++ b/src/backend/Texture.cpp @@ -1,7 +1,8 @@ #include "Texture.h" -#include #include "math/HashAlgorithm.h" -#include "StringUtils.hpp" +#include "StringUtils.h" + +#include CC_BACKEND_BEGIN diff --git a/src/backend/metal/RenderPipelineMTL.mm b/src/backend/metal/RenderPipelineMTL.mm index 7ef134f..e6dccad 100644 --- a/src/backend/metal/RenderPipelineMTL.mm +++ b/src/backend/metal/RenderPipelineMTL.mm @@ -3,7 +3,7 @@ #include "ShaderModuleMTL.h" #include "DepthStencilStateMTL.h" #include "Utils.h" -#include "../StringUtils.hpp" +#include "../StringUtils.h" #include "math/HashAlgorithm.h" CC_BACKEND_BEGIN diff --git a/test/Test.xcodeproj/project.pbxproj b/test/Test.xcodeproj/project.pbxproj index 4be1007..ae1acc6 100644 --- a/test/Test.xcodeproj/project.pbxproj +++ b/test/Test.xcodeproj/project.pbxproj @@ -490,8 +490,8 @@ 469492811FE252FB008D19CC /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 469492831FE2530E008D19CC /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; ED0875D0218BF27900B7F6A4 /* StringUtils.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = StringUtils.cpp; sourceTree = ""; }; - ED0875D1218BF27900B7F6A4 /* StringUtils.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = StringUtils.hpp; sourceTree = ""; }; ED2F9F45218FDC3F008E6BC2 /* ParticleBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParticleBackend.cpp; sourceTree = ""; }; + ED366CF92199B77400035735 /* StringUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringUtils.h; sourceTree = ""; }; ED3B4C3E217E15BF00D982A0 /* GuiProjectionBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GuiProjectionBackend.cpp; sourceTree = ""; }; ED3B4C3F217E15BF00D982A0 /* ParticleBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParticleBackend.h; sourceTree = ""; }; ED3B4C40217E15C000D982A0 /* GuiProjectionBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GuiProjectionBackend.h; sourceTree = ""; }; @@ -854,8 +854,8 @@ 460373AF212FA9EB00DC9ED4 /* backend */ = { isa = PBXGroup; children = ( + ED366CF92199B77400035735 /* StringUtils.h */, ED0875D0218BF27900B7F6A4 /* StringUtils.cpp */, - ED0875D1218BF27900B7F6A4 /* StringUtils.hpp */, 460374512148F78600DC9ED4 /* Backend.h */, 460373F9213932AE00DC9ED4 /* BindGroup.cpp */, 460373FA213932AE00DC9ED4 /* BindGroup.h */, From d4f63bef333131848e20f30db344da6cf0e2e2be Mon Sep 17 00:00:00 2001 From: coulsonwang <> Date: Mon, 12 Nov 2018 21:58:29 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E3=80=90Feature=E3=80=91use=20std::hash?= =?UTF-8?q?=20since=20the=20collision=20probability=20approaching=201.0/st?= =?UTF-8?q?d::numeric=5Flimits::max().?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/Texture.cpp | 1 - src/backend/Texture.h | 2 +- src/backend/metal/DeviceMTL.mm | 1 - src/backend/metal/RenderPipelineMTL.h | 6 +++--- src/backend/metal/RenderPipelineMTL.mm | 5 ++--- src/backend/metal/ShaderModuleMTL.h | 2 +- src/backend/metal/ShaderModuleMTL.mm | 5 ++--- src/backend/metal/TextureMTL.mm | 5 +---- test/Test.xcodeproj/project.pbxproj | 8 -------- 9 files changed, 10 insertions(+), 25 deletions(-) diff --git a/src/backend/Texture.cpp b/src/backend/Texture.cpp index 79beedd..0c18ec2 100644 --- a/src/backend/Texture.cpp +++ b/src/backend/Texture.cpp @@ -1,5 +1,4 @@ #include "Texture.h" -#include "math/HashAlgorithm.h" #include "StringUtils.h" #include diff --git a/src/backend/Texture.h b/src/backend/Texture.h index 79dbee4..af4e401 100644 --- a/src/backend/Texture.h +++ b/src/backend/Texture.h @@ -40,7 +40,7 @@ class Texture : public cocos2d::Ref TextureFormat _textureFormat = TextureFormat::R8G8B8; TextureUsage _textureUsage = TextureUsage::READ; bool _isMipmapEnabled = false; - uint32_t _textureHashCode = 0; + size_t _textureHashCode = 0; }; CC_BACKEND_END diff --git a/src/backend/metal/DeviceMTL.mm b/src/backend/metal/DeviceMTL.mm index 2d3c542..8af6538 100644 --- a/src/backend/metal/DeviceMTL.mm +++ b/src/backend/metal/DeviceMTL.mm @@ -8,7 +8,6 @@ #include "TextureMTL.h" #include "BlendStateMTL.h" #include "Utils.h" -#include "math/HashAlgorithm.h" CC_BACKEND_BEGIN diff --git a/src/backend/metal/RenderPipelineMTL.h b/src/backend/metal/RenderPipelineMTL.h index 74991d4..7b43361 100644 --- a/src/backend/metal/RenderPipelineMTL.h +++ b/src/backend/metal/RenderPipelineMTL.h @@ -28,8 +28,8 @@ class RenderPipelineMTL : public RenderPipeline inline const std::vector& getFragmentUniforms() const { return _fragmentUniforms; } inline const std::vector& getVertexTextures() const { return _vertexTextures; } inline const std::vector& getFragmentTextures() const { return _fragmentTextures; } - inline const uint32_t getHash() const {return _hashRenderPipelineDescriptor;}; - uint32_t createHash(const RenderPipelineDescriptor& descriptor); + inline const size_t getHash() const {return _hashRenderPipelineDescriptor;}; + size_t createHash(const RenderPipelineDescriptor& descriptor); private: void setVertexLayout(MTLRenderPipelineDescriptor*, const RenderPipelineDescriptor&); @@ -49,7 +49,7 @@ class RenderPipelineMTL : public RenderPipeline MTLRenderPipelineDescriptor* _mtlRenderPipelineDescriptor = nil; BlendDescriptorMTL _blendDescriptorMTL; - uint32_t _hashRenderPipelineDescriptor = 0; + size_t _hashRenderPipelineDescriptor = 0; }; CC_BACKEND_END diff --git a/src/backend/metal/RenderPipelineMTL.mm b/src/backend/metal/RenderPipelineMTL.mm index e6dccad..bf991ac 100644 --- a/src/backend/metal/RenderPipelineMTL.mm +++ b/src/backend/metal/RenderPipelineMTL.mm @@ -4,7 +4,6 @@ #include "DepthStencilStateMTL.h" #include "Utils.h" #include "../StringUtils.h" -#include "math/HashAlgorithm.h" CC_BACKEND_BEGIN @@ -197,7 +196,7 @@ MTLVertexFormat toMTLVertexFormat(VertexFormat vertexFormat) colorAttachmentDescriptor.destinationAlphaBlendFactor = _blendDescriptorMTL.destinationAlphaBlendFactor; } -uint32_t RenderPipelineMTL::createHash(const RenderPipelineDescriptor& descriptor) +size_t RenderPipelineMTL::createHash(const RenderPipelineDescriptor& descriptor) { std::string info = ""; ShaderModuleMTL* vertModule = static_cast(descriptor.getVertexShaderModule()); @@ -248,7 +247,7 @@ MTLVertexFormat toMTLVertexFormat(VertexFormat vertexFormat) info += StringUtils::BlendFactor2String(blendDescriptor.destinationAlphaBlendFactor); } - return HashAlgorithm::PJWHash(info.c_str(), info.length()); + return std::hash{}(info); } CC_BACKEND_END diff --git a/src/backend/metal/ShaderModuleMTL.h b/src/backend/metal/ShaderModuleMTL.h index 2901fb1..430dad9 100644 --- a/src/backend/metal/ShaderModuleMTL.h +++ b/src/backend/metal/ShaderModuleMTL.h @@ -33,7 +33,7 @@ class ShaderModuleMTL : public ShaderModule // Texture index is the same as vector index. std::vector _textures; - uint32_t _hashCode = 0; + size_t _hashCode = 0; }; CC_BACKEND_END diff --git a/src/backend/metal/ShaderModuleMTL.mm b/src/backend/metal/ShaderModuleMTL.mm index 417b314..d2480e3 100644 --- a/src/backend/metal/ShaderModuleMTL.mm +++ b/src/backend/metal/ShaderModuleMTL.mm @@ -2,7 +2,6 @@ #include "DeviceMTL.h" #include "glsl_optimizer/glsl/glsl_optimizer.h" -#include "math/HashAlgorithm.h" CC_BACKEND_BEGIN @@ -60,7 +59,7 @@ assert(false); } - _hashCode = HashAlgorithm::PJWHash(source.c_str(), source.length()); + _hashCode = std::hash{}(source); glslopt_shader_delete(glslShader); glslopt_cleanup(ctx); @@ -107,7 +106,7 @@ bool ShaderModuleMTL::Find(const std::string& source) { - uint32_t hashShader = HashAlgorithm::PJWHash(source.c_str(), source.length()); + size_t hashShader = std::hash{}(source); return _hashCode == hashShader ? true : false; } diff --git a/src/backend/metal/TextureMTL.mm b/src/backend/metal/TextureMTL.mm index de8c8fc..4bd95f4 100644 --- a/src/backend/metal/TextureMTL.mm +++ b/src/backend/metal/TextureMTL.mm @@ -1,6 +1,5 @@ #include "TextureMTL.h" #include "Utils.h" -#include "math/HashAlgorithm.h" CC_BACKEND_BEGIN @@ -92,9 +91,7 @@ bool convertData(uint8_t* src, uint32_t length, TextureFormat format, uint8_t** void TextureMTL::updateData(uint8_t* data) { - uint8_t componentCount = (TextureFormat::R8G8B8 == _textureFormat)?3:4; - size_t dataLen = _mtlTexture.width * _mtlTexture.height*componentCount; - uint32_t dataHash = HashAlgorithm::PJWHash((char*)data, dataLen); + size_t dataHash = std::hash{}(data); if(_textureHashCode == dataHash) return; _textureHashCode = dataHash; diff --git a/test/Test.xcodeproj/project.pbxproj b/test/Test.xcodeproj/project.pbxproj index ae1acc6..cd81e56 100644 --- a/test/Test.xcodeproj/project.pbxproj +++ b/test/Test.xcodeproj/project.pbxproj @@ -202,8 +202,6 @@ ED2F9F47218FDC40008E6BC2 /* ParticleBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED2F9F45218FDC3F008E6BC2 /* ParticleBackend.cpp */; }; ED3B4C42217E15C000D982A0 /* GuiProjectionBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED3B4C3E217E15BF00D982A0 /* GuiProjectionBackend.cpp */; }; ED3B4C43217E15C000D982A0 /* GuiProjectionBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED3B4C3E217E15BF00D982A0 /* GuiProjectionBackend.cpp */; }; - ED54310621880D080048B076 /* HashAlgorithm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED54310521880D080048B076 /* HashAlgorithm.cpp */; }; - ED54310721880D080048B076 /* HashAlgorithm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED54310521880D080048B076 /* HashAlgorithm.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -495,8 +493,6 @@ ED3B4C3E217E15BF00D982A0 /* GuiProjectionBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GuiProjectionBackend.cpp; sourceTree = ""; }; ED3B4C3F217E15BF00D982A0 /* ParticleBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParticleBackend.h; sourceTree = ""; }; ED3B4C40217E15C000D982A0 /* GuiProjectionBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GuiProjectionBackend.h; sourceTree = ""; }; - ED54310421880D080048B076 /* HashAlgorithm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashAlgorithm.h; sourceTree = ""; }; - ED54310521880D080048B076 /* HashAlgorithm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HashAlgorithm.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -633,8 +629,6 @@ 1A255D9820034B0D00069420 /* math */ = { isa = PBXGroup; children = ( - ED54310521880D080048B076 /* HashAlgorithm.cpp */, - ED54310421880D080048B076 /* HashAlgorithm.h */, 1A255DB720034B0D00069420 /* CCAffineTransform.cpp */, 1A255DA820034B0D00069420 /* CCAffineTransform.h */, 1A255DA620034B0D00069420 /* CCGeometry.cpp */, @@ -1320,7 +1314,6 @@ 1ACB61B71FF6028B0007F081 /* unzip.cpp in Sources */, 1A255E4820034B0D00069420 /* MathUtil.cpp in Sources */, 1ACB61B81FF6028F0007F081 /* tinyxml2.cpp in Sources */, - ED54310721880D080048B076 /* HashAlgorithm.cpp in Sources */, 1A255E5020034B0D00069420 /* TransformUtils.cpp in Sources */, 1A255E5A20034B0D00069420 /* Vec2.cpp in Sources */, ); @@ -1376,7 +1369,6 @@ 468BD2E02154FE66007BCACF /* VertexLayout.cpp in Sources */, 460373DB21363EDE00DC9ED4 /* BasicBackend.cpp in Sources */, 468BD2E12154FE6D007BCACF /* BindGroup.cpp in Sources */, - ED54310621880D080048B076 /* HashAlgorithm.cpp in Sources */, 468BD2DF2154FCB0007BCACF /* BlendStateMTL.mm in Sources */, 1A255E5920034B0D00069420 /* Vec2.cpp in Sources */, 461DD0DB2153773F00A8E43F /* DeviceMTL.mm in Sources */, From a11fa1e7a74f0616c348ad197be78f8972fe06ac Mon Sep 17 00:00:00 2001 From: coulsonwang <> Date: Tue, 13 Nov 2018 09:50:59 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E3=80=90Feature=E3=80=91remove=20unused?= =?UTF-8?q?=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cocos/math/HashAlgorithm.cpp | 28 ---------------------------- cocos/math/HashAlgorithm.h | 14 -------------- src/backend/Device.h | 6 ------ 3 files changed, 48 deletions(-) delete mode 100755 cocos/math/HashAlgorithm.cpp delete mode 100755 cocos/math/HashAlgorithm.h diff --git a/cocos/math/HashAlgorithm.cpp b/cocos/math/HashAlgorithm.cpp deleted file mode 100755 index 0464ddc..0000000 --- a/cocos/math/HashAlgorithm.cpp +++ /dev/null @@ -1,28 +0,0 @@ - -#include "math/HashAlgorithm.h" -#include "math/TimeUtils.h" - -unsigned int HashAlgorithm::PJWHash(const char* str, size_t len) -{ -// INIT_TIMER -// START_TIMER - unsigned int BitsInUnsignedInt = (unsigned int)(sizeof(unsigned int) * 8); - unsigned int ThreeQuarters = (unsigned int)((BitsInUnsignedInt * 3) / 4); - unsigned int OneEighth = (unsigned int)(BitsInUnsignedInt / 8); - unsigned int HighBits = (unsigned int)(0xFFFFFFFF) << (BitsInUnsignedInt - OneEighth); - unsigned int hash = 0; - unsigned int test = 0; - - for (size_t i = 0; i < len; i++) - { - hash = (hash << OneEighth) + str[i]; - - if ((test = hash & HighBits) != 0) - { - hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits)); - } - } -// STOP_TIMER("HashAlgorithm::PJWHash") - return hash; -} -/* End Of P. J. Weinberger Hash Function */ diff --git a/cocos/math/HashAlgorithm.h b/cocos/math/HashAlgorithm.h deleted file mode 100755 index 051e992..0000000 --- a/cocos/math/HashAlgorithm.h +++ /dev/null @@ -1,14 +0,0 @@ - -#ifndef _HASHALGORITHM_H_ -#define _HASHALGORITHM_H_ - -#include - -class HashAlgorithm { - -public: - static unsigned int PJWHash(const char* str, size_t len); -}; - - -#endif /* _HASHALGORITHM_H_ */ diff --git a/src/backend/Device.h b/src/backend/Device.h index 71f17a6..6443d99 100644 --- a/src/backend/Device.h +++ b/src/backend/Device.h @@ -33,22 +33,16 @@ class Device : public cocos2d::Ref virtual Buffer* newBuffer(uint32_t size, BufferType type, BufferUsage usage) = 0; // Create a render pass, not auto released. virtual RenderPass* newRenderPass(const RenderPassDescriptor& descriptor) = 0; - // Cache RenderPass for reuse -// virtual RenderPass* cacheRenderPass(const RenderPassDescriptor& descriptor) = 0; // Create a texture, not auto released. virtual Texture* newTexture(const TextureDescriptor& descriptor) = 0; // Create a auto released shader module. virtual ShaderModule* createShaderModule(ShaderStage stage, const std::string& source) = 0; - // Cache ShaderModule for reuse -// virtual ShaderModule* cacheShaderModule(ShaderStage stage, const std::string& source) = 0; // Create a auto released depth stencil state. virtual DepthStencilState* createDepthStencilState(const DepthStencilDescriptor& descriptor) = 0; // Create a auto released blend state. virtual BlendState* createBlendState(const BlendDescriptor& descriptor) = 0; // Create a render pipeline, not auto released. virtual RenderPipeline* newRenderPipeline(const RenderPipelineDescriptor& descriptor) = 0; - // Cache RenderPipeline for reuse -// virtual RenderPipeline* cacheRenderPipeline(const RenderPipelineDescriptor& descriptor) = 0; private: static Device* _instance; }; From 85f0bccc1ecf092314240d34b4f08ec9d885c0ac Mon Sep 17 00:00:00 2001 From: coulsonwang <> Date: Tue, 13 Nov 2018 09:53:19 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E3=80=90Feature=E3=80=91add=20a=20new=20?= =?UTF-8?q?line=20to=20separate=20functions=20and=20members?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/Device.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/Device.h b/src/backend/Device.h index 6443d99..70c7a0b 100644 --- a/src/backend/Device.h +++ b/src/backend/Device.h @@ -43,6 +43,7 @@ class Device : public cocos2d::Ref virtual BlendState* createBlendState(const BlendDescriptor& descriptor) = 0; // Create a render pipeline, not auto released. virtual RenderPipeline* newRenderPipeline(const RenderPipelineDescriptor& descriptor) = 0; + private: static Device* _instance; }; From af86fd6c2762f952ebd7ce2f06b8f6a9f3b57b3b Mon Sep 17 00:00:00 2001 From: coulsonwang <> Date: Tue, 13 Nov 2018 15:05:54 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E3=80=90BugFix=E3=80=91fix=20return=20ty?= =?UTF-8?q?pe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/Texture.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/Texture.h b/src/backend/Texture.h index af4e401..7496026 100644 --- a/src/backend/Texture.h +++ b/src/backend/Texture.h @@ -27,7 +27,7 @@ class Texture : public cocos2d::Ref inline TextureUsage getTextureUsage() const { return _textureUsage; } inline uint32_t getWidth() const { return _width; } inline uint32_t getHeight() const { return _height; } - inline uint32_t getTextureHashCode() const {return _textureHashCode;} + inline size_t getTextureHashCode() const {return _textureHashCode;} protected: Texture(const TextureDescriptor& descriptor); virtual ~Texture();