transient buffer is not coherently mapped - renderdoc is way too slow with coherent buffers
This commit is contained in:
parent
0e4bd3ab41
commit
4f4b3fe33e
27 changed files with 79 additions and 108 deletions
|
@ -39,8 +39,8 @@ fragment_shader [[
|
|||
in vec3 v_pos;
|
||||
in vec4 v_rot;
|
||||
|
||||
uniform sampler2D u_gbuffer_depth;
|
||||
uniform sampler2D u_texture;
|
||||
layout (binding=0) uniform sampler2D u_gbuffer_depth;
|
||||
layout (binding=1) uniform sampler2D u_texture;
|
||||
|
||||
void main()
|
||||
{
|
||||
|
|
|
@ -17,11 +17,11 @@ vertex_shader [[
|
|||
fragment_shader [[
|
||||
in vec2 v_uv;
|
||||
out vec4 o_color;
|
||||
uniform sampler2D u_gbuffer0;
|
||||
uniform sampler2D u_gbuffer1;
|
||||
uniform sampler2D u_gbuffer2;
|
||||
uniform sampler2D u_gbuffer_depth;
|
||||
uniform sampler2D u_shadowmap;
|
||||
layout (binding=0) uniform sampler2D u_gbuffer0;
|
||||
layout (binding=1) uniform sampler2D u_gbuffer1;
|
||||
layout (binding=2) uniform sampler2D u_gbuffer2;
|
||||
layout (binding=3) uniform sampler2D u_gbuffer_depth;
|
||||
layout (binding=4) uniform sampler2D u_shadowmap;
|
||||
|
||||
void main()
|
||||
{
|
||||
|
|
|
@ -18,7 +18,7 @@ vertex_shader [[
|
|||
|
||||
|
||||
fragment_shader [[
|
||||
uniform sampler2D u_texture;
|
||||
layout (binding=0) uniform sampler2D u_texture;
|
||||
in vec4 v_color;
|
||||
in vec2 v_uv;
|
||||
out vec4 o_color;
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
texture_slot {
|
||||
name = "Albedo",
|
||||
uniform = "u_albedomap",
|
||||
default_texture = "textures/common/white.tga"
|
||||
}
|
||||
|
||||
|
@ -24,7 +23,7 @@ vertex_shader [[
|
|||
---------------------
|
||||
|
||||
fragment_shader [[
|
||||
uniform sampler2D u_albedomap;
|
||||
layout (binding=0) uniform sampler2D u_albedomap;
|
||||
in vec2 v_uv;
|
||||
in vec3 v_normal;
|
||||
|
||||
|
|
|
@ -21,11 +21,11 @@ fragment_shader [[
|
|||
in vec3 v_uv;
|
||||
out vec4 o_color;
|
||||
|
||||
uniform sampler2D u_gbuffer0;
|
||||
uniform sampler2D u_gbuffer1;
|
||||
uniform sampler2D u_gbuffer2;
|
||||
uniform sampler2D u_gbuffer_depth;
|
||||
uniform sampler2D u_shadowmap;
|
||||
layout (binding=0) uniform sampler2D u_gbuffer0;
|
||||
layout (binding=1) uniform sampler2D u_gbuffer1;
|
||||
layout (binding=2) uniform sampler2D u_gbuffer2;
|
||||
layout (binding=3) uniform sampler2D u_gbuffer_depth;
|
||||
layout (binding=4) uniform sampler2D u_shadowmap;
|
||||
uniform vec4 u_pos_radius;
|
||||
|
||||
void main()
|
||||
|
|
|
@ -101,7 +101,7 @@ fragment_shader [[
|
|||
return in_color + noise * grainamount;
|
||||
}
|
||||
|
||||
uniform sampler2D u_source;
|
||||
layout (binding=0) uniform sampler2D u_source;
|
||||
in vec2 v_uv;
|
||||
out vec4 o_color;
|
||||
void main() {
|
||||
|
|
|
@ -711,7 +711,7 @@ fragment_shader [[
|
|||
return FxaaTexTop(tex, posM);
|
||||
}
|
||||
|
||||
uniform sampler2D u_fxaa_buffer;
|
||||
layout (binding=0) uniform sampler2D u_fxaa_buffer;
|
||||
in vec2 v_uv;
|
||||
out vec4 o_color;
|
||||
|
||||
|
|
|
@ -50,10 +50,10 @@ fragment_shader [[
|
|||
in vec3 v_dir;
|
||||
in float v_fov;
|
||||
|
||||
uniform sampler2D u_gbuffer0;
|
||||
uniform sampler2D u_gbuffer1;
|
||||
uniform sampler2D u_gbuffer2;
|
||||
uniform sampler2D u_gbuffer_depth;
|
||||
layout (binding=0) uniform sampler2D u_gbuffer0;
|
||||
layout (binding=1) uniform sampler2D u_gbuffer1;
|
||||
layout (binding=2) uniform sampler2D u_gbuffer2;
|
||||
layout (binding=3) uniform sampler2D u_gbuffer_depth;
|
||||
|
||||
void main()
|
||||
{
|
||||
|
|
|
@ -13,7 +13,7 @@ vertex_shader [[
|
|||
|
||||
fragment_shader [[
|
||||
|
||||
uniform sampler2D u_mask;
|
||||
layout (binding=0) uniform sampler2D u_mask;
|
||||
in vec2 v_uv;
|
||||
layout(location = 0) out vec4 o_color;
|
||||
|
||||
|
|
|
@ -1,24 +1,20 @@
|
|||
texture_slot {
|
||||
name = "Albedo",
|
||||
uniform = "u_albedomap",
|
||||
default_texture = "textures/common/white.tga"
|
||||
}
|
||||
|
||||
texture_slot {
|
||||
name = "Normal",
|
||||
uniform = "u_normalmap",
|
||||
default_texture = "textures/common/default_normal.tga"
|
||||
}
|
||||
|
||||
texture_slot {
|
||||
name = "Roughness",
|
||||
uniform = "u_roughnessmap",
|
||||
default_texture = "textures/common/white.tga"
|
||||
}
|
||||
|
||||
texture_slot {
|
||||
name = "Metallic",
|
||||
uniform = "u_metallicmap",
|
||||
default_texture = "textures/common/white.tga"
|
||||
}
|
||||
|
||||
|
@ -82,11 +78,11 @@ vertex_shader [[
|
|||
---------------------
|
||||
|
||||
fragment_shader [[
|
||||
uniform sampler2D u_albedomap;
|
||||
uniform sampler2D u_normalmap;
|
||||
uniform sampler2D u_roughnessmap;
|
||||
uniform sampler2D u_metallicmap;
|
||||
uniform sampler2D u_shadowmap;
|
||||
layout (binding=0) uniform sampler2D u_albedomap;
|
||||
layout (binding=1) uniform sampler2D u_normalmap;
|
||||
layout (binding=2) uniform sampler2D u_roughnessmap;
|
||||
layout (binding=3) uniform sampler2D u_metallicmap;
|
||||
layout (binding=4) uniform sampler2D u_shadowmap;
|
||||
uniform vec4 u_material_params;
|
||||
uniform vec4 u_material_color;
|
||||
in vec2 v_uv;
|
||||
|
|
|
@ -2,19 +2,16 @@ include "pipelines/common.glsl"
|
|||
|
||||
texture_slot {
|
||||
name = "Heightmap",
|
||||
uniform = "u_hm",
|
||||
default_texture = "textures/common/white.tga"
|
||||
}
|
||||
|
||||
texture_slot {
|
||||
name = "Albedo",
|
||||
uniform = "u_albedo",
|
||||
default_texture = "textures/common/white.tga"
|
||||
}
|
||||
|
||||
texture_slot {
|
||||
name = "Splatmap",
|
||||
uniform = "u_splatmap",
|
||||
default_texture = "textures/common/white.tga"
|
||||
}
|
||||
|
||||
|
@ -28,6 +25,11 @@ vertex_shader [[
|
|||
]]
|
||||
|
||||
|
||||
common [[
|
||||
const float hscale = 32;
|
||||
]]
|
||||
|
||||
|
||||
geometry_shader [[
|
||||
layout (points) in;
|
||||
layout (triangle_strip, max_vertices = 4) out;
|
||||
|
@ -41,8 +43,6 @@ geometry_shader [[
|
|||
uniform ivec4 u_from_to;
|
||||
uniform ivec4 u_from_to_sup;
|
||||
|
||||
const float hscale = 128;
|
||||
|
||||
void getVertex(ivec2 ij, out vec3 pos)
|
||||
{
|
||||
pos = vec3(ij.x, 0.0, ij.y) * (1 << u_lod);
|
||||
|
@ -109,11 +109,9 @@ fragment_shader [[
|
|||
|
||||
in vec2 v_uv;
|
||||
layout(binding = 0) uniform sampler2D u_hm;
|
||||
layout(binding = 1) uniform samplerArray u_albedo;
|
||||
layout(binding = 1) uniform sampler2DArray u_albedo;
|
||||
uniform int u_lod;
|
||||
|
||||
const float hscale = 128;
|
||||
|
||||
vec3 getNormal(vec2 uv)
|
||||
{
|
||||
vec3 off = vec3(-1.0/2048.0, 0, 1.0/2048.0);
|
||||
|
@ -129,10 +127,7 @@ fragment_shader [[
|
|||
void getData()
|
||||
{
|
||||
data.normal = getNormal(v_uv);
|
||||
data.albedo = texture(u_albedo, v_uv);
|
||||
#ifdef ALPHA_CUTOUT
|
||||
if(data.albedo.a < 0.5) discard;
|
||||
#endif
|
||||
data.albedo = texture(u_albedo, vec3(v_uv, 0));
|
||||
data.wpos = vec3(0);
|
||||
data.roughness = 0.9;
|
||||
data.metallic = 0;
|
||||
|
|
|
@ -26,7 +26,7 @@ vertex_shader [[
|
|||
|
||||
fragment_shader [[
|
||||
|
||||
uniform sampler2D u_texture;
|
||||
layout (binding=0) uniform sampler2D u_texture;
|
||||
in vec4 v_color;
|
||||
in vec2 v_uv;
|
||||
layout(location = 0) out vec4 o_color;
|
||||
|
|
|
@ -11,7 +11,7 @@ vertex_shader [[
|
|||
|
||||
|
||||
fragment_shader [[
|
||||
uniform sampler2D u_texture;
|
||||
layout (binding=0) uniform sampler2D u_texture;
|
||||
in vec2 v_uv;
|
||||
out vec4 o_color;
|
||||
void main() {
|
||||
|
|
|
@ -37,7 +37,7 @@ fragment_shader [[
|
|||
return (in_color / max(0.00001, lum)) * ld;
|
||||
}
|
||||
|
||||
uniform sampler2D u_hdrbuffer;
|
||||
layout (binding=0) uniform sampler2D u_hdrbuffer;
|
||||
in vec2 v_uv;
|
||||
out vec4 o_color;
|
||||
void main() {
|
||||
|
|
|
@ -1523,21 +1523,11 @@ struct ShaderPlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
|
|||
ImGui::CollapsingHeader(
|
||||
"Texture slots", nullptr, ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_Framed))
|
||||
{
|
||||
ImGui::Columns(2);
|
||||
ImGui::Text("name");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("uniform");
|
||||
ImGui::NextColumn();
|
||||
ImGui::Separator();
|
||||
for (int i = 0; i < shader->m_texture_slot_count; ++i)
|
||||
{
|
||||
auto& slot = shader->m_texture_slots[i];
|
||||
ImGui::Text("%s", slot.name);
|
||||
ImGui::NextColumn();
|
||||
ImGui::Text("%s", slot.uniform);
|
||||
ImGui::NextColumn();
|
||||
}
|
||||
ImGui::Columns(1);
|
||||
}
|
||||
if (!shader->m_uniforms.empty() &&
|
||||
ImGui::CollapsingHeader("Uniforms", nullptr, ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_Framed))
|
||||
|
|
|
@ -335,6 +335,8 @@ void SceneView::renderGizmos()
|
|||
|
||||
memcpy(ib.ptr, indices, ib.size);
|
||||
memcpy(vb.ptr, vertices, vb.size);
|
||||
ffr::flushBuffer(ib.buffer, ib.offset, ib.size);
|
||||
ffr::flushBuffer(vb.buffer, vb.offset, vb.size);
|
||||
|
||||
ffr::setUniformMatrix4f(model_uniform, &cmd.mtx.m11);
|
||||
ffr::useProgram(prg);
|
||||
|
|
|
@ -36,10 +36,10 @@ namespace Lumix
|
|||
static const ComponentType MODEL_INSTANCE_TYPE = Reflection::getComponentType("model_instance");
|
||||
static const ComponentType TERRAIN_TYPE = Reflection::getComponentType("terrain");
|
||||
static const ComponentType HEIGHTFIELD_TYPE = Reflection::getComponentType("physical_heightfield");
|
||||
static const char* HEIGHTMAP_UNIFORM = "u_heightmap";
|
||||
static const char* SPLATMAP_UNIFORM = "u_splatmap";
|
||||
static const char* COLORMAP_UNIFORM = "u_colormap";
|
||||
static const char* TEX_COLOR_UNIFORM = "u_detail_albedomap";
|
||||
static const char* HEIGHTMAP_SLOT_NAME = "Heightmap";
|
||||
static const char* SPLATMAP_SLOT_NAME = "Splatmap";
|
||||
static const char* DETAIL_ALBEDO_SLOT_NAME = "Albedo";
|
||||
static const char* SATELLITE_SLOT_NAME = "Satellite";
|
||||
static const float MIN_BRUSH_SIZE = 0.5f;
|
||||
|
||||
|
||||
|
@ -250,17 +250,17 @@ private:
|
|||
case TerrainEditor::REMOVE_GRASS:
|
||||
case TerrainEditor::ADD_GRASS:
|
||||
case TerrainEditor::LAYER:
|
||||
uniform_name = SPLATMAP_UNIFORM;
|
||||
uniform_name = SPLATMAP_SLOT_NAME;
|
||||
break;
|
||||
case TerrainEditor::COLOR:
|
||||
uniform_name = COLORMAP_UNIFORM;
|
||||
uniform_name = SATELLITE_SLOT_NAME;
|
||||
break;
|
||||
default:
|
||||
uniform_name = HEIGHTMAP_UNIFORM;
|
||||
uniform_name = HEIGHTMAP_SLOT_NAME;
|
||||
break;
|
||||
}
|
||||
|
||||
return getMaterial()->getTextureByUniform(uniform_name);
|
||||
return getMaterial()->getTextureByName(uniform_name);
|
||||
}
|
||||
|
||||
|
||||
|
@ -784,14 +784,14 @@ void TerrainEditor::splitSplatmap(const char* dir)
|
|||
g_log_error.log("Renderer") << "Terrain has no material";
|
||||
return;
|
||||
}
|
||||
Texture* splatmap = material->getTextureByUniform("u_texSplatmap");
|
||||
Texture* splatmap = material->getTextureByName("Splatmap");
|
||||
if (!splatmap)
|
||||
{
|
||||
g_log_error.log("Renderer") << "Terrain's material has no splatmap";
|
||||
return;
|
||||
}
|
||||
|
||||
Texture* diffuse = material->getTextureByUniform("u_texColor");
|
||||
Texture* diffuse = material->getTextureByName("Albedo");
|
||||
if (!diffuse)
|
||||
{
|
||||
g_log_error.log("Renderer") << "Terrain's material has no diffuse texture";
|
||||
|
@ -858,7 +858,7 @@ void TerrainEditor::mergeSplatmap(const char* dir)
|
|||
g_log_error.log("Renderer") << "Terrain has no material";
|
||||
return;
|
||||
}
|
||||
Texture* splatmap = material->getTextureByUniform("u_texSplatmap");
|
||||
Texture* splatmap = material->getTextureByName("Splatmap");
|
||||
if (!splatmap)
|
||||
{
|
||||
g_log_error.log("Renderer") << "Terrain's material has no splatmap";
|
||||
|
@ -975,7 +975,7 @@ void TerrainEditor::nextTerrainTexture()
|
|||
{
|
||||
Material* material = getMaterial();
|
||||
if (!material) return;
|
||||
Texture* tex = material->getTextureByUniform(TEX_COLOR_UNIFORM);
|
||||
Texture* tex = material->getTextureByName(DETAIL_ALBEDO_SLOT_NAME);
|
||||
if (tex) m_texture_idx = Math::minimum(tex->layers - 1, m_texture_idx + 1);
|
||||
}
|
||||
|
||||
|
@ -1106,7 +1106,7 @@ Vec3 TerrainEditor::getRelativePosition(const Vec3& world_pos) const
|
|||
|
||||
Texture* TerrainEditor::getHeightmap()
|
||||
{
|
||||
return getMaterial()->getTextureByUniform(HEIGHTMAP_UNIFORM);
|
||||
return getMaterial()->getTextureByName(HEIGHTMAP_SLOT_NAME);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1531,16 +1531,16 @@ void TerrainEditor::onGUI()
|
|||
{
|
||||
case HEIGHT:
|
||||
if (ImGui::Button("Save heightmap"))
|
||||
getMaterial()->getTextureByUniform(HEIGHTMAP_UNIFORM)->save();
|
||||
getMaterial()->getTextureByName(HEIGHTMAP_SLOT_NAME)->save();
|
||||
break;
|
||||
case GRASS:
|
||||
case LAYER:
|
||||
if (ImGui::Button("Save layermap and grassmap"))
|
||||
getMaterial()->getTextureByUniform(SPLATMAP_UNIFORM)->save();
|
||||
getMaterial()->getTextureByName(SPLATMAP_SLOT_NAME)->save();
|
||||
break;
|
||||
case COLOR:
|
||||
if (ImGui::Button("Save colormap"))
|
||||
getMaterial()->getTextureByUniform(COLORMAP_UNIFORM)->save();
|
||||
getMaterial()->getTextureByName(SATELLITE_SLOT_NAME)->save();
|
||||
break;
|
||||
case ENTITY: break;
|
||||
}
|
||||
|
@ -1651,7 +1651,7 @@ void TerrainEditor::onGUI()
|
|||
case LAYER:
|
||||
{
|
||||
m_action_type = TerrainEditor::LAYER;
|
||||
Texture* tex = getMaterial()->getTextureByUniform(TEX_COLOR_UNIFORM);
|
||||
Texture* tex = getMaterial()->getTextureByName(DETAIL_ALBEDO_SLOT_NAME);
|
||||
if (tex)
|
||||
{
|
||||
for (int i = 0; i < tex->layers; ++i)
|
||||
|
|
|
@ -1198,6 +1198,14 @@ void bindUniformBuffer(uint index, BufferHandle buffer, size_t offset, size_t si
|
|||
}
|
||||
|
||||
|
||||
void flushBuffer(BufferHandle buffer, size_t offset, size_t len)
|
||||
{
|
||||
checkThread();
|
||||
const GLuint buf = g_ffr.buffers[buffer.value].handle;
|
||||
glFlushMappedNamedBufferRange(buf, offset, len);
|
||||
}
|
||||
|
||||
|
||||
void* map(BufferHandle buffer, size_t offset, size_t size, uint flags)
|
||||
{
|
||||
checkThread();
|
||||
|
|
|
@ -237,6 +237,7 @@ void bindLayer(FramebufferHandle fb, TextureHandle rb, uint layer);
|
|||
void update(BufferHandle buffer, const void* data, size_t offset, size_t size);
|
||||
void* map(BufferHandle buffer, size_t offset, size_t size, uint flags);
|
||||
void unmap(BufferHandle buffer);
|
||||
void flushBuffer(BufferHandle buffer, size_t offset, size_t len);
|
||||
void bindUniformBuffer(uint index, BufferHandle buffer, size_t offset, size_t size);
|
||||
void getTextureImage(ffr::TextureHandle texture, uint size, void* buf);
|
||||
TextureInfo getTextureInfo(const void* data);
|
||||
|
|
|
@ -50,6 +50,7 @@ FFR_GL_IMPORT(PFNGLDRAWARRAYSINSTANCEDARBPROC, glDrawArraysInstanced);
|
|||
FFR_GL_IMPORT(PFNGLDRAWBUFFERSPROC, glDrawBuffers);
|
||||
FFR_GL_IMPORT(PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced);
|
||||
FFR_GL_IMPORT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray);
|
||||
FFR_GL_IMPORT(PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC, glFlushMappedNamedBufferRange);
|
||||
FFR_GL_IMPORT(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D);
|
||||
FFR_GL_IMPORT(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers);
|
||||
FFR_GL_IMPORT(PFNGLGENERATEMIPMAPPROC, glGenerateMipmap);
|
||||
|
|
|
@ -507,19 +507,12 @@ void Material::setShader(Shader* shader)
|
|||
}
|
||||
|
||||
|
||||
ffr::UniformHandle Material::getTextureUniform(int i) const
|
||||
{
|
||||
if (i < m_shader->m_texture_slot_count) return m_shader->m_texture_slots[i].uniform_handle;
|
||||
return ffr::INVALID_UNIFORM;
|
||||
}
|
||||
|
||||
|
||||
Texture* Material::getTextureByUniform(const char* uniform) const
|
||||
Texture* Material::getTextureByName(const char* name) const
|
||||
{
|
||||
if (!m_shader) return nullptr;
|
||||
|
||||
for (int i = 0, c = m_shader->m_texture_slot_count; i < c; ++i) {
|
||||
if (equalStrings(m_shader->m_texture_slots[i].uniform, uniform)) {
|
||||
if (equalStrings(m_shader->m_texture_slots[i].name, name)) {
|
||||
return m_textures[i];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -87,8 +87,7 @@ public:
|
|||
|
||||
int getTextureCount() const { return m_texture_count; }
|
||||
Texture* getTexture(int i) const { return i < m_texture_count ? m_textures[i] : nullptr; }
|
||||
ffr::UniformHandle getTextureUniform(int i) const;
|
||||
Texture* getTextureByUniform(const char* uniform) const;
|
||||
Texture* getTextureByName(const char* name) const;
|
||||
bool isTextureDefine(u8 define_idx) const;
|
||||
void setTexture(int i, Texture* texture);
|
||||
void setTexturePath(int i, const Path& path);
|
||||
|
|
|
@ -581,6 +581,7 @@ struct PipelineImpl final : Pipeline
|
|||
const Renderer::TransientSlice vb = pipeline->m_renderer.allocTransient(vertices.byte_size());
|
||||
|
||||
memcpy(vb.ptr, vertices.begin(), vb.size);
|
||||
ffr::flushBuffer(vb.buffer, vb.offset, vb.size);
|
||||
|
||||
ffr::setVertexBuffer(&vertex_decl, vb.buffer, vb.offset, nullptr);
|
||||
ffr::setIndexBuffer(ffr::INVALID_BUFFER);
|
||||
|
@ -936,6 +937,7 @@ struct PipelineImpl final : Pipeline
|
|||
|
||||
const void* mem = blob.skip(byte_size);
|
||||
memcpy(transient.ptr, mem, byte_size);
|
||||
ffr::flushBuffer(transient.buffer, transient.offset, transient.size);
|
||||
|
||||
const Shader::Program& prog = Shader::getProgram(shader_data, 0);
|
||||
if (prog.handle.isValid()) {
|
||||
|
@ -1526,7 +1528,7 @@ struct PipelineImpl final : Pipeline
|
|||
Renderer& renderer = m_pipeline->m_renderer;
|
||||
const Renderer::TransientSlice transient = renderer.allocTransient(m_vertices.byte_size());
|
||||
memcpy(transient.ptr, m_vertices.begin(), transient.size);
|
||||
ffr::setUniform1i(m_texture_uniform, 0);
|
||||
ffr::flushBuffer(transient.buffer, transient.offset, transient.size);
|
||||
ffr::useProgram(p.handle);
|
||||
ffr::VertexDecl decl;
|
||||
const u64 blend_state = ffr::getBlendStateBits(ffr::BlendFactors::SRC_ALPHA, ffr::BlendFactors::ONE_MINUS_SRC_ALPHA, ffr::BlendFactors::SRC_ALPHA, ffr::BlendFactors::ONE_MINUS_SRC_ALPHA);
|
||||
|
@ -1543,7 +1545,6 @@ struct PipelineImpl final : Pipeline
|
|||
ffr::TextureHandle m_atlas;
|
||||
ShaderRenderData* m_shader;
|
||||
PipelineImpl* m_pipeline;
|
||||
ffr::UniformHandle m_texture_uniform;
|
||||
Array<TextMeshVertex> m_vertices;
|
||||
};
|
||||
|
||||
|
@ -1552,7 +1553,6 @@ struct PipelineImpl final : Pipeline
|
|||
RenderJob* job = LUMIX_NEW(allocator, RenderJob)(allocator);
|
||||
job->m_pipeline = this;
|
||||
job->m_shader = m_text_mesh_shader->m_render_data;
|
||||
job->m_texture_uniform = m_text_mesh_shader->m_texture_slots[0].uniform_handle;
|
||||
m_renderer.push(job);
|
||||
}
|
||||
|
||||
|
@ -1613,6 +1613,8 @@ struct PipelineImpl final : Pipeline
|
|||
|
||||
const Renderer::TransientSlice instance_buffer = m_pipeline->m_renderer.allocTransient(instances_count * instance_decl.size);
|
||||
memcpy(instance_buffer.ptr, instance_data, instance_buffer.size);
|
||||
ffr::flushBuffer(instance_buffer.buffer, instance_buffer.offset, instance_buffer.size);
|
||||
|
||||
ffr::setInstanceBuffer(instance_decl, instance_buffer.buffer, instance_buffer.offset, 1, nullptr);
|
||||
ffr::drawTrianglesInstanced(0, 36, instances_count);
|
||||
}
|
||||
|
@ -1740,9 +1742,7 @@ struct PipelineImpl final : Pipeline
|
|||
for (int i = 0; i < 16; ++i) ffr::bindTexture(i, ffr::INVALID_TEXTURE);
|
||||
for (int i = 0; i < material->textures_count; ++i) {
|
||||
const ffr::TextureHandle handle = material->textures[i];
|
||||
const ffr::UniformHandle uniform = shader->texture_uniforms[i];
|
||||
ffr::bindTexture(i, handle);
|
||||
ffr::setUniform1i(uniform, i);
|
||||
}
|
||||
|
||||
const Shader::Program& prog = Shader::getProgram(shader, instanced_mask);
|
||||
|
@ -1763,6 +1763,7 @@ struct PipelineImpl final : Pipeline
|
|||
|
||||
const Renderer::TransientSlice instance_buffer = m_pipeline->m_renderer.allocTransient(instances_count * sizeof(Vec4) * 2);
|
||||
memcpy(instance_buffer.ptr, instance_data, instance_buffer.size);
|
||||
ffr::flushBuffer(instance_buffer.buffer, instance_buffer.offset, instance_buffer.size);
|
||||
|
||||
int instance_map[16];
|
||||
for (uint i = 0; i < instance_decl.attributes_count; ++i) {
|
||||
|
@ -1790,9 +1791,7 @@ struct PipelineImpl final : Pipeline
|
|||
ShaderRenderData* shader = material->shader;
|
||||
for (int i = 0; i < material->textures_count; ++i) {
|
||||
const ffr::TextureHandle handle = material->textures[i];
|
||||
const ffr::UniformHandle uniform = shader->texture_uniforms[i];
|
||||
ffr::bindTexture(i, handle);
|
||||
ffr::setUniform1i(uniform, i);
|
||||
}
|
||||
|
||||
const Shader::Program& prog = Shader::getProgram(shader, skinned_mask);
|
||||
|
@ -1826,9 +1825,7 @@ struct PipelineImpl final : Pipeline
|
|||
ShaderRenderData* shader = material->shader;
|
||||
for (int i = 0; i < material->textures_count; ++i) {
|
||||
const ffr::TextureHandle handle = material->textures[i];
|
||||
const ffr::UniformHandle uniform = shader->texture_uniforms[i];
|
||||
ffr::bindTexture(i, handle);
|
||||
ffr::setUniform1i(uniform, i);
|
||||
}
|
||||
|
||||
const u8* instance_data = cmd;
|
||||
|
@ -1843,6 +1840,8 @@ struct PipelineImpl final : Pipeline
|
|||
|
||||
const Renderer::TransientSlice instance_buffer = m_pipeline->m_renderer.allocTransient(instances_count * decal_instance_decl.size);
|
||||
memcpy(instance_buffer.ptr, instance_data, instance_buffer.size);
|
||||
ffr::flushBuffer(instance_buffer.buffer, instance_buffer.offset, instance_buffer.size);
|
||||
|
||||
ffr::setInstanceBuffer(decal_instance_decl, instance_buffer.buffer, instance_buffer.offset, 1, nullptr);
|
||||
ffr::drawTrianglesInstanced(0, 36, instances_count);
|
||||
++drawcalls_count;
|
||||
|
@ -2899,7 +2898,6 @@ void Pipeline::renderModel(Model& model, const Matrix& mtx, ffr::UniformHandle m
|
|||
|
||||
for(int i = 0; i < textures_count; ++i) {
|
||||
ffr::bindTexture(i, material->getTexture(i)->handle);
|
||||
ffr::setUniform1i(material->getTextureUniform(i), i);
|
||||
}
|
||||
|
||||
int attribute_map[16];
|
||||
|
|
|
@ -981,7 +981,6 @@ int RenderTask::task()
|
|||
m_transient_buffer = ffr::allocBufferHandle();
|
||||
m_transient_buffer_offset = 0;
|
||||
const uint transient_flags = (uint)ffr::BufferFlags::PERSISTENT
|
||||
| (uint)ffr::BufferFlags::COHERENT
|
||||
| (uint)ffr::BufferFlags::MAP_WRITE;
|
||||
ffr::createBuffer(m_transient_buffer, transient_flags, TRANSIENT_BUFFER_SIZE, nullptr);
|
||||
m_transient_buffer_ptr = (u8*)ffr::map(m_transient_buffer, 0, TRANSIENT_BUFFER_SIZE, transient_flags);
|
||||
|
|
|
@ -270,11 +270,6 @@ int texture_slot(lua_State* L)
|
|||
Shader::TextureSlot& slot = shader->m_texture_slots[shader->m_texture_slot_count];
|
||||
LuaWrapper::getOptionalStringField(L, -1, "name", slot.name, lengthOf(slot.name));
|
||||
|
||||
if(LuaWrapper::getOptionalStringField(L, -1, "uniform", slot.uniform, lengthOf(slot.uniform))) {
|
||||
slot.uniform_handle = ffr::allocUniform(slot.uniform, ffr::UniformType::INT, 1);
|
||||
}
|
||||
shader->m_render_data->texture_uniforms[shader->m_texture_slot_count] = slot.uniform_handle;
|
||||
|
||||
char tmp[MAX_PATH_LENGTH];
|
||||
if(LuaWrapper::getOptionalStringField(L, -1, "default_texture", tmp, lengthOf(tmp))) {
|
||||
ResourceManagerHub& manager = shader->getResourceManager().getOwner();
|
||||
|
|
|
@ -31,15 +31,11 @@ public:
|
|||
TextureSlot()
|
||||
{
|
||||
name[0] = '\0';
|
||||
uniform[0] = '\0';
|
||||
define_idx = -1;
|
||||
uniform_handle = ffr::INVALID_UNIFORM;
|
||||
default_texture = nullptr;
|
||||
}
|
||||
|
||||
char name[32];
|
||||
char uniform[32];
|
||||
ffr::UniformHandle uniform_handle;
|
||||
int define_idx = -1;
|
||||
Texture* default_texture = nullptr;
|
||||
};
|
||||
|
@ -125,7 +121,6 @@ struct ShaderRenderData
|
|||
, common_source(allocator)
|
||||
, attributes(allocator)
|
||||
{}
|
||||
ffr::UniformHandle texture_uniforms[Shader::MAX_TEXTURE_SLOT_COUNT];
|
||||
IAllocator& allocator;
|
||||
Renderer& renderer;
|
||||
HashMap<u32, Shader::Program> programs;
|
||||
|
|
|
@ -674,7 +674,7 @@ void Terrain::onMaterialLoaded(Resource::State, Resource::State new_state, Resou
|
|||
PROFILE_FUNCTION();
|
||||
if (new_state == Resource::State::READY)
|
||||
{
|
||||
m_heightmap = m_material->getTextureByUniform("u_hm");
|
||||
m_heightmap = m_material->getTextureByName("Heightmap");
|
||||
bool is_data_ready = true;
|
||||
if (m_heightmap && m_heightmap->getData() == nullptr)
|
||||
{
|
||||
|
@ -687,8 +687,8 @@ void Terrain::onMaterialLoaded(Resource::State, Resource::State new_state, Resou
|
|||
m_height = m_heightmap->height;
|
||||
}
|
||||
|
||||
m_albedomap = m_material->getTextureByUniform("u_albedo");
|
||||
m_splatmap = m_material->getTextureByUniform("u_splatmap");
|
||||
m_albedomap = m_material->getTextureByName("Albedo");
|
||||
m_splatmap = m_material->getTextureByName("Splatmap");
|
||||
|
||||
/*
|
||||
Texture* colormap = m_material->getTextureByUniform("u_colormap");
|
||||
|
|
Loading…
Reference in a new issue