Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
7 changes: 2 additions & 5 deletions engine/includes/commandbuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ struct Global {
Vector4 cameraPosition;
Vector4 cameraParams;
Vector4 params;
Vector4 padding;
};

class ENGINE_EXPORT CommandBuffer: public Object {
Expand All @@ -34,7 +35,7 @@ class ENGINE_EXPORT CommandBuffer: public Object {

void begin();

virtual void dispatchCompute(ComputeInstance *shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ);
virtual void dispatchCompute(ComputeInstance &shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ);

virtual void drawMesh(Mesh *mesh, uint32_t sub, uint32_t layer, MaterialInstance &instance);

Expand All @@ -52,10 +53,6 @@ class ENGINE_EXPORT CommandBuffer: public Object {

virtual void disableScissor();

virtual Matrix4 projection() const;

virtual Matrix4 view() const;

virtual Texture *texture(const TString &name) const;

virtual void beginDebugMarker(const TString &name);
Expand Down
14 changes: 1 addition & 13 deletions engine/src/commandbuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ void CommandBuffer::begin() {
Dispatches a compute \a shader with the specified workgroup dimensions.
Parameters \a groupsX, \a groupsY and \a groupsZ alows to specify a size of workgroup in each demension.
*/
void CommandBuffer::dispatchCompute(ComputeInstance *shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) {
void CommandBuffer::dispatchCompute(ComputeInstance &shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) {
A_UNUSED(shader);
A_UNUSED(groupsX);
A_UNUSED(groupsY);
Expand Down Expand Up @@ -104,18 +104,6 @@ void CommandBuffer::setGlobalTexture(const TString &name, Texture *texture) {
item.binding = -1;
m_textures.push_back(item);
}
/*!
Returns current projection matrix.
*/
Matrix4 CommandBuffer::projection() const {
return m_global.projection;
}
/*!
Returns current view matrix.
*/
Matrix4 CommandBuffer::view() const {
return m_global.view;
}
/*!
Retrieves a global texture based on its \a name.
*/
Expand Down
163 changes: 99 additions & 64 deletions modules/editor/shadertools/converter/shaderbuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,77 @@ ShaderBuilderSettings::Rhi ShaderBuilder::currentRhi() {
return rhi;
}

TString uniformDataHelper(const Uniform &uniform, int &offset, int &sub) {
static const char *compNames = "xyzw";

TString comp = ".";

TString prefix;

switch(uniform.type) {
case MetaType::BOOLEAN: {
prefix = "floatBitsToInt(";
comp += TString(1, compNames[sub]) + ") != 0";
sub++;
} break;
case MetaType::INTEGER: {
prefix = "floatBitsToInt(";
comp += TString(1, compNames[sub]) + ")";
sub++;
} break;
case MetaType::FLOAT: {
comp += TString(1, compNames[sub]);
sub++;
} break;
case MetaType::VECTOR2: {
if(sub > 2) {
sub = 0;
offset++;
}

comp += TString(1, compNames[sub]);
sub++;
comp += compNames[sub];
sub++;
} break;
case MetaType::VECTOR3: {
if(sub > 1) {
sub = 0;
offset++;
}

comp += TString(1, compNames[sub]);
sub++;
comp += compNames[sub];
sub++;
comp += compNames[sub];
sub++;
} break;
case MetaType::VECTOR4: {
comp.clear();
sub = 4;
} break;
case MetaType::MATRIX4: {
comp.clear();
sub = 0;
TString data = "mat4(\n";
data += " instance.data[_instanceOffset + " + std::to_string(offset) + "],\n";
offset++;
data += " instance.data[_instanceOffset + " + std::to_string(offset) + "],\n";
offset++;
data += " instance.data[_instanceOffset + " + std::to_string(offset) + "],\n";
offset++;
data += " instance.data[_instanceOffset + " + std::to_string(offset) + "])";
offset++;

return data;
} break;
default: break;
}

return prefix + "instance.data[_instanceOffset + " + std::to_string(offset) + "]" + comp;
}

void ShaderBuilder::buildInstanceData(const VariantMap &user, PragmaMap &pragmas) {
TString result;

Expand All @@ -151,78 +222,46 @@ void ShaderBuilder::buildInstanceData(const VariantMap &user, PragmaMap &pragmas
auto it = user.find(UNIFORMS);
if(it != user.end()) {
int sub = 0;
const char *compNames = "xyzw";

TString tab(" ");

for(auto &p : it->second.toList()) {
Uniform uniform = uniformFromVariant(p);

TString comp;
TString data;

if(uniform.type == MetaType::MATRIX4) {
if(sub > 0) {
sub = 0;
offset++;
}
TString array;
if(uniform.count > 1) {
array = TString("[%1]").arg(TString::number(uniform.count));
data = uniform.typeName + array + "(\n";
}

} else {
TString prefix;

switch(uniform.type) {
case MetaType::BOOLEAN: {
prefix = "floatBitsToInt(";
comp = TString(1, compNames[sub]);
comp += ") != 0";
sub++;
} break;
case MetaType::INTEGER: {
prefix = "floatBitsToInt(";
comp = TString(1, compNames[sub]);
comp += ")";
sub++;
} break;
case MetaType::FLOAT: {
comp = TString(1, compNames[sub]);
sub++;
} break;
case MetaType::VECTOR2: {
if(sub > 2) {
sub = 0;
offset++;
}

comp = TString(1, compNames[sub]);
sub++;
comp += compNames[sub];
sub++;
} break;
case MetaType::VECTOR3: {
if(sub > 1) {
sub = 0;
offset++;
}

comp = TString(1, compNames[sub]);
sub++;
comp += compNames[sub];
sub++;
comp += compNames[sub];
sub++;
} break;
case MetaType::VECTOR4: {
comp = compNames;
sub = 4;
} break;
default: break;
for(int i = 0; i < uniform.count; i++) {
if(uniform.count > 1) {
data += tab + tab;
}
data += uniformDataHelper(uniform, offset, sub);
if(uniform.count > 1) {
if(i < uniform.count - 1) {
data += ",\n";
} else {
data += "\n";
}
} else {
data += ";\n";
}

TString data = prefix + "instance.data[_instanceOffset + " + std::to_string(offset) + "]." + comp + ";\n";

if(sub >= 4) {
sub = 0;
offset++;
}
}

uniforms += TString(" ") + uniform.typeName + " " + uniform.name + " = " + data;
if(uniform.count > 1) {
data += tab + ");\n";
}

uniforms += tab + uniform.typeName + " " + uniform.name + array + " = " + data;
}

if(sub > 0) {
Expand All @@ -234,7 +273,7 @@ void ShaderBuilder::buildInstanceData(const VariantMap &user, PragmaMap &pragmas

pragmas["instance"] = result;
pragmas["objectId"] = objectId;
pragmas["offset"] = "_instanceOffset = gl_InstanceIndex * " + std::to_string(offset) + ";\n";
pragmas["offset"] = " _instanceOffset = gl_InstanceIndex * " + std::to_string(offset) + ";\n";
pragmas["skinOffset"] = "const int skinOffset = " + std::to_string(offset) + ";\n";
}

Expand Down Expand Up @@ -511,10 +550,6 @@ bool ShaderBuilder::parseShaderFormat(const TString &path, VariantMap &user, int
}
}

if(materialType == Material::LightFunction) {
define += "\n#define NO_INSTANCE";
}

str = shaders[gVertex];
if(!str.isEmpty()) {
user[STATIC] = loadShader(str, define, pragmas);
Expand Down
1 change: 0 additions & 1 deletion modules/editor/shadertools/shaders/Shader.frag
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ layout(location = 0) out vec4 gbuffer0;
#pragma uniforms

#include "ShaderLayout.h"

#include "Functions.h"

#pragma fragmentFunctions
Expand Down
2 changes: 1 addition & 1 deletion modules/renders/rendergl/includes/commandbuffergl.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class CommandBufferGL : public CommandBuffer {
public:
CommandBufferGL();

void dispatchCompute(ComputeInstance *shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) override;
void dispatchCompute(ComputeInstance &shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) override;

void drawMesh(Mesh *mesh, uint32_t sub, uint32_t layer, MaterialInstance &instance) override;

Expand Down
12 changes: 5 additions & 7 deletions modules/renders/rendergl/src/commandbuffergl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,15 @@ CommandBufferGL::CommandBufferGL() {
PROFILE_FUNCTION();
}

void CommandBufferGL::dispatchCompute(ComputeInstance *shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) {
void CommandBufferGL::dispatchCompute(ComputeInstance &shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) {
#ifndef THUNDER_MOBILE
PROFILE_FUNCTION();

if(shader) {
ComputeInstanceGL *instance = static_cast<ComputeInstanceGL *>(shader);
if(instance->bind(this)) {
glDispatchCompute(groupsX, groupsY, groupsZ);
ComputeInstanceGL &instance = static_cast<ComputeInstanceGL &>(shader);
if(instance.bind(this)) {
glDispatchCompute(groupsX, groupsY, groupsZ);

glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
}
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
}
#endif
}
Expand Down
2 changes: 1 addition & 1 deletion modules/renders/rendermt/includes/commandbuffermt.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class CommandBufferMt : public CommandBuffer {

RenderTargetMt *currentRenderTarget() const;

void dispatchCompute(ComputeInstance *shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) override;
void dispatchCompute(ComputeInstance &shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) override;

void drawMesh(Mesh *mesh, uint32_t sub, uint32_t layer, MaterialInstance &instance) override;

Expand Down
16 changes: 7 additions & 9 deletions modules/renders/rendermt/src/commandbuffermt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,18 @@ RenderTargetMt *CommandBufferMt::currentRenderTarget() const {
return m_currentTarget;
}

void CommandBufferMt::dispatchCompute(ComputeInstance *shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) {
void CommandBufferMt::dispatchCompute(ComputeInstance &shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) {
PROFILE_FUNCTION();

if(shader) {
ComputeInstanceMt *instance = static_cast<ComputeInstanceMt *>(shader);
ComputeInstanceMt &instance = static_cast<ComputeInstanceMt &>(shader);

MTL::ComputeCommandEncoder *computeEncoder = m_commandBuffer->computeCommandEncoder();
if(instance->bind(this, computeEncoder)) {
MTL::Size threadgroupSize(instance->maxTotalThreadsPerThreadgroup(), 1, 1);
MTL::ComputeCommandEncoder *computeEncoder = m_commandBuffer->computeCommandEncoder();
if(instance.bind(this, computeEncoder)) {
MTL::Size threadgroupSize(instance.maxTotalThreadsPerThreadgroup(), 1, 1);

computeEncoder->dispatchThreads(MTL::Size(groupsX, groupsY, groupsZ), threadgroupSize);
computeEncoder->dispatchThreads(MTL::Size(groupsX, groupsY, groupsZ), threadgroupSize);

computeEncoder->endEncoding();
}
computeEncoder->endEncoding();
}
}

Expand Down
2 changes: 1 addition & 1 deletion modules/renders/rendervk/includes/commandbuffervk.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class CommandBufferVk : public CommandBuffer {
void beginDebugMarker(const TString &name) override;
void endDebugMarker() override;

void dispatchCompute(ComputeInstance *shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) override;
void dispatchCompute(ComputeInstance &shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) override;

void drawMesh(Mesh *mesh, uint32_t sub, uint32_t layer, MaterialInstance &instance) override;

Expand Down
10 changes: 4 additions & 6 deletions modules/renders/rendervk/src/commandbuffervk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,12 @@ void CommandBufferVk::end() {
}
}

void CommandBufferVk::dispatchCompute(ComputeInstance *shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) {
void CommandBufferVk::dispatchCompute(ComputeInstance &shader, int32_t groupsX, int32_t groupsY, int32_t groupsZ) {
PROFILE_FUNCTION();

if(shader) {
ComputeInstanceVk *comp = static_cast<ComputeInstanceVk *>(shader);
if(comp->bind(*this)) {
vkCmdDispatch(m_commandBuffer, groupsX, groupsY, groupsZ);
}
ComputeInstanceVk &comp = static_cast<ComputeInstanceVk &>(shader);
if(comp.bind(*this)) {
vkCmdDispatch(m_commandBuffer, groupsX, groupsY, groupsZ);
}
}

Expand Down
Loading
Loading