Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/backend/Backend.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#pragma once

#include "backend/BindGroup.h"
#include "backend/RenderPassDescriptor.h"
#include "backend/RenderPipeline.h"
#include "backend/RenderPipelineDescriptor.h"
Expand All @@ -13,3 +12,4 @@
#include "backend/Texture.h"
#include "backend/DepthStencilState.h"
#include "backend/BlendState.h"
#include "backend/Program.h"
98 changes: 0 additions & 98 deletions src/backend/BindGroup.cpp

This file was deleted.

57 changes: 0 additions & 57 deletions src/backend/BindGroup.h

This file was deleted.

2 changes: 0 additions & 2 deletions src/backend/CommandBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ CC_BACKEND_BEGIN
class RenderPass;
class RenderPipeline;
class Buffer;
class BindGroup;

class CommandBuffer : public cocos2d::Ref
{
Expand All @@ -24,7 +23,6 @@ class CommandBuffer : public cocos2d::Ref
virtual void setViewport(uint32_t x, uint32_t y, uint32_t w, uint32_t h) = 0;
virtual void setCullMode(CullMode mode) = 0;
virtual void setVertexBuffer(uint32_t index, Buffer* buffer) = 0;
virtual void setBindGroup(BindGroup* bindGroup) = 0;
virtual void setIndexBuffer(Buffer* buffer) = 0;
virtual void drawArrays(PrimitiveType primitiveType, uint32_t start, uint32_t count) = 0;
virtual void drawElements(PrimitiveType primitiveType, IndexFormat indexType, uint32_t count) = 0;
Expand Down
3 changes: 3 additions & 0 deletions src/backend/Device.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class Buffer;
class ShaderModule;
class RenderPipeline;
class RenderPass;
class Program;

class Device : public cocos2d::Ref
{
Expand All @@ -41,6 +42,8 @@ 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;
virtual Program* createProgram(ShaderModule* vs, ShaderModule* fs) = 0;


private:
static Device* _instance;
Expand Down
74 changes: 74 additions & 0 deletions src/backend/Program.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#include "Program.h"
#include "ShaderModule.h"
#include "Texture.h"

CC_BACKEND_BEGIN

Program::~Program()
{
_vertexTextureInfos.clear();
_fragTextureInfos.clear();
}

Program::TextureInfo::~TextureInfo()
{
releaseTextures();
}

void Program::TextureInfo::retainTextures()
{
for (auto& texture : textures)
CC_SAFE_RETAIN(texture);
}

void Program::TextureInfo::releaseTextures()
{
for (auto& texture : textures)
CC_SAFE_RELEASE(texture);
}

void Program::setVertexTexture(int location, uint32_t slot, Texture* texture)
{
setTexture(location, slot, texture, _vertexTextureInfos);
}

void Program::setFragmentTexture(int location, uint32_t slot, Texture* texture)
{
setTexture(location, slot, texture, _fragTextureInfos);
}

void Program::setVertexTextureArray(int location, const std::vector<uint32_t>& slots, const std::vector<Texture*> textures)
{
setTextureArray(location, slots, textures, _vertexTextureInfos);
}

void Program::setFragmentTextureArray(int location, const std::vector<uint32_t>& slots, const std::vector<Texture*> textures)
{
setTextureArray(location, slots, textures, _fragTextureInfos);
}

void Program::setTexture(int location, uint32_t slot, Texture* texture, std::vector<TextureInfo>& textureInfo)
{
if(location < 0)
return;

TextureInfo info;
info.location = location;
info.slot = {slot};
info.textures = {texture};
info.retainTextures();
textureInfo.at(location) = info;
}

void Program::setTextureArray(int location, const std::vector<uint32_t>& slots, const std::vector<Texture*> textures, std::vector<TextureInfo>& textureInfo)
{
assert(slots.size() == textures.size());
TextureInfo info;
info.location = location;
info.slot = slots;
info.textures = textures;
info.retainTextures();
textureInfo.at(location) = info;
}

CC_BACKEND_END
52 changes: 52 additions & 0 deletions src/backend/Program.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#pragma once

#include "Macros.h"
#include "base/CCRef.h"
#include "platform/CCPlatformMacros.h"
#include <string>
#include <vector>

CC_BACKEND_BEGIN

class ShaderModule;
class Texture;

class Program : public Ref
{
public:
struct TextureInfo
{
~TextureInfo();

void retainTextures();
void releaseTextures();

int location = 0;
std::vector<uint32_t> slot;
std::vector<Texture*> textures;
};

virtual int getVertexUniformLocation(const std::string& uniform) const = 0;
virtual int getFragmentUniformLocation(const std::string& uniform) const = 0;
virtual void setVertexUniform(int location, void* data, uint32_t size) = 0;
virtual void setFragmentUniform(int location, void* data, uint32_t size) = 0;
virtual void setVertexTexture(int location, uint32_t slot, Texture* texture);
virtual void setFragmentTexture(int location, uint32_t slot, Texture* texture);
virtual void setVertexTextureArray(int location, const std::vector<uint32_t>& slots, const std::vector<Texture*> textures);
virtual void setFragmentTextureArray(int location, const std::vector<uint32_t>& slots, const std::vector<Texture*> textures);

inline const std::vector<TextureInfo>& getVertexTextureInfos() const { return _vertexTextureInfos; }
inline const std::vector<TextureInfo>& getFragmentTextureInfos() const { return _fragTextureInfos; }

protected:
Program() = default;
virtual ~Program();

void setTexture(int location, uint32_t slot, Texture* texture, std::vector<TextureInfo>& textureInfo);
void setTextureArray(int location, const std::vector<uint32_t>& slots, const std::vector<Texture*> textures, std::vector<TextureInfo>& textureInfo);

std::vector<TextureInfo> _vertexTextureInfos;
std::vector<TextureInfo> _fragTextureInfos;
};

CC_BACKEND_END
17 changes: 17 additions & 0 deletions src/backend/RenderPipeline.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include "RenderPipeline.h"
#include "Program.h"

CC_BACKEND_BEGIN

RenderPipeline::RenderPipeline(Program* program)
:_program(program)
{
CC_SAFE_RETAIN(_program);
}

RenderPipeline::~RenderPipeline()
{
CC_SAFE_RELEASE(_program);
}

CC_BACKEND_END
10 changes: 8 additions & 2 deletions src/backend/RenderPipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@
#include "base/CCRef.h"

CC_BACKEND_BEGIN

class Program;
class RenderPipeline : public cocos2d::Ref
{
public:
RenderPipeline(Program* program);
virtual ~RenderPipeline();
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does it need to be public?


virtual Program* getProgram() { return _program; }
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add const


protected:
virtual ~RenderPipeline() = default;
Program* _program = nullptr;
};

CC_BACKEND_END
4 changes: 2 additions & 2 deletions src/backend/RenderPipelineDescriptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ CC_BACKEND_BEGIN
class ShaderModule;
class DepthStencilState;
class BlendState;
class Program;

struct RenderPipelineDescriptor
{
ShaderModule* vertexShaderModule = nullptr;
ShaderModule* fragmentShaderModule = nullptr;
Program* program = nullptr;
DepthStencilState* depthStencilState = nullptr;
BlendState* blendState = nullptr;
std::vector<VertexLayout> vertexLayouts;
Expand Down
Loading