Bindless textures
This commit is contained in:
parent
fc9506f520
commit
e499826c1f
@ -20,6 +20,8 @@ STRUCT(Vertex)
|
|||||||
f32 uv_x;
|
f32 uv_x;
|
||||||
f32 uv_y;
|
f32 uv_y;
|
||||||
Vec4 color;
|
Vec4 color;
|
||||||
|
u32 texture_index;
|
||||||
|
u32 reserved[3];
|
||||||
};
|
};
|
||||||
decl_vb(Vertex);
|
decl_vb(Vertex);
|
||||||
|
|
||||||
@ -30,7 +32,7 @@ STRUCT(GPUDrawPushConstants)
|
|||||||
f32 height;
|
f32 height;
|
||||||
};
|
};
|
||||||
|
|
||||||
fn void draw_string(Renderer* renderer, VirtualBuffer(Vertex)* vertices, VirtualBuffer(u32)* indices, u32 width, u32 height, Vec4 color, String string, TextureAtlas texture_atlas)
|
fn void draw_string(Renderer* renderer, VirtualBuffer(Vertex)* vertices, VirtualBuffer(u32)* indices, u32 width, u32 height, Vec4 color, String string, TextureAtlas texture_atlas, u32 texture_index)
|
||||||
{
|
{
|
||||||
u32 index_offset = 0;
|
u32 index_offset = 0;
|
||||||
auto x_offset = width / 2;
|
auto x_offset = width / 2;
|
||||||
@ -53,6 +55,7 @@ fn void draw_string(Renderer* renderer, VirtualBuffer(Vertex)* vertices, Virtual
|
|||||||
.uv_x = (f32)uv_x / texture_atlas.width,
|
.uv_x = (f32)uv_x / texture_atlas.width,
|
||||||
.uv_y = (f32)uv_y / texture_atlas.width,
|
.uv_y = (f32)uv_y / texture_atlas.width,
|
||||||
.color = color,
|
.color = color,
|
||||||
|
.texture_index = texture_index,
|
||||||
};
|
};
|
||||||
*vb_add(vertices, 1) = (Vertex) {
|
*vb_add(vertices, 1) = (Vertex) {
|
||||||
.x = pos_x + character->width,
|
.x = pos_x + character->width,
|
||||||
@ -60,6 +63,7 @@ fn void draw_string(Renderer* renderer, VirtualBuffer(Vertex)* vertices, Virtual
|
|||||||
.uv_x = (f32)(uv_x + uv_width) / texture_atlas.width,
|
.uv_x = (f32)(uv_x + uv_width) / texture_atlas.width,
|
||||||
.uv_y = (f32)uv_y / texture_atlas.width,
|
.uv_y = (f32)uv_y / texture_atlas.width,
|
||||||
.color = color,
|
.color = color,
|
||||||
|
.texture_index = texture_index,
|
||||||
};
|
};
|
||||||
*vb_add(vertices, 1) = (Vertex) {
|
*vb_add(vertices, 1) = (Vertex) {
|
||||||
.x = pos_x,
|
.x = pos_x,
|
||||||
@ -67,6 +71,7 @@ fn void draw_string(Renderer* renderer, VirtualBuffer(Vertex)* vertices, Virtual
|
|||||||
.uv_x = (f32)uv_x / texture_atlas.width,
|
.uv_x = (f32)uv_x / texture_atlas.width,
|
||||||
.uv_y = (f32)(uv_y + uv_height) / texture_atlas.width,
|
.uv_y = (f32)(uv_y + uv_height) / texture_atlas.width,
|
||||||
.color = color,
|
.color = color,
|
||||||
|
.texture_index = texture_index,
|
||||||
};
|
};
|
||||||
*vb_add(vertices, 1) = (Vertex) {
|
*vb_add(vertices, 1) = (Vertex) {
|
||||||
.x = pos_x + character->width,
|
.x = pos_x + character->width,
|
||||||
@ -74,6 +79,7 @@ fn void draw_string(Renderer* renderer, VirtualBuffer(Vertex)* vertices, Virtual
|
|||||||
.uv_x = (f32)(uv_x + uv_width) / texture_atlas.width,
|
.uv_x = (f32)(uv_x + uv_width) / texture_atlas.width,
|
||||||
.uv_y = (f32)(uv_y + uv_height) / texture_atlas.width,
|
.uv_y = (f32)(uv_y + uv_height) / texture_atlas.width,
|
||||||
.color = color,
|
.color = color,
|
||||||
|
.texture_index = texture_index,
|
||||||
};
|
};
|
||||||
|
|
||||||
*vb_add(indices, 1) = index_offset + 0;
|
*vb_add(indices, 1) = index_offset + 0;
|
||||||
@ -131,7 +137,7 @@ void run_app(Arena* arena)
|
|||||||
.binding = 0,
|
.binding = 0,
|
||||||
.type = DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER,
|
.type = DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER,
|
||||||
.stage = SHADER_STAGE_FRAGMENT,
|
.stage = SHADER_STAGE_FRAGMENT,
|
||||||
.count = 1,
|
.count = 2,
|
||||||
},
|
},
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
@ -149,6 +155,20 @@ void run_app(Arena* arena)
|
|||||||
.pipelines = array_to_slice(pipeline_create),
|
.pipelines = array_to_slice(pipeline_create),
|
||||||
.shader_sources = array_to_slice(shader_source_paths),
|
.shader_sources = array_to_slice(shader_source_paths),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
u32 white_texture_width = 1024;
|
||||||
|
u32 white_texture_height = white_texture_width;
|
||||||
|
auto* white_texture_buffer = arena_allocate(arena, u32, white_texture_width * white_texture_height / sizeof(u32));
|
||||||
|
memset(white_texture_buffer, 0xff, white_texture_width * white_texture_height);
|
||||||
|
|
||||||
|
auto white_texture = renderer_texture_create(renderer, (TextureMemory) {
|
||||||
|
.pointer = white_texture_buffer,
|
||||||
|
.width = white_texture_width,
|
||||||
|
.height = white_texture_height,
|
||||||
|
.depth = 1,
|
||||||
|
.format = R8G8B8A8_SRGB,
|
||||||
|
});
|
||||||
|
|
||||||
auto font_path =
|
auto font_path =
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
strlit("C:/Users/David/Downloads/Fira_Sans/FiraSans-Regular.ttf")
|
strlit("C:/Users/David/Downloads/Fira_Sans/FiraSans-Regular.ttf")
|
||||||
@ -173,9 +193,10 @@ strlit("/usr/share/fonts/TTF/FiraSans-Regular.ttf")
|
|||||||
.set = { .value = 0 },
|
.set = { .value = 0 },
|
||||||
.type = DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER,
|
.type = DESCRIPTOR_TYPE_IMAGE_PLUS_SAMPLER,
|
||||||
.binding = 0,
|
.binding = 0,
|
||||||
.descriptor_count = 1,
|
.descriptor_count = 2,
|
||||||
.textures = {
|
.textures = {
|
||||||
[0] = texture_atlas_image,
|
[0] = white_texture,
|
||||||
|
[1] = texture_atlas_image,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -188,7 +209,8 @@ strlit("/usr/share/fonts/TTF/FiraSans-Regular.ttf")
|
|||||||
Vec4 color = {1, 1, 1, 1};
|
Vec4 color = {1, 1, 1, 1};
|
||||||
static_assert(sizeof(color) == 4 * sizeof(float));
|
static_assert(sizeof(color) == 4 * sizeof(float));
|
||||||
|
|
||||||
draw_string(renderer, &vertices, &indices, initial_window_size.width, initial_window_size.height, color, strlit("Hello world!"), texture_atlas);
|
u32 texture_index = 1;
|
||||||
|
draw_string(renderer, &vertices, &indices, initial_window_size.width, initial_window_size.height, color, strlit("He"), texture_atlas, texture_index);
|
||||||
|
|
||||||
auto vertex_buffer_size = sizeof(*vertices.pointer) * vertices.length;
|
auto vertex_buffer_size = sizeof(*vertices.pointer) * vertices.length;
|
||||||
auto index_buffer_size = sizeof(*indices.pointer) * indices.length;
|
auto index_buffer_size = sizeof(*indices.pointer) * indices.length;
|
||||||
|
@ -1,16 +1,19 @@
|
|||||||
#version 450
|
#version 450
|
||||||
|
#extension GL_EXT_nonuniform_qualifier : require
|
||||||
|
|
||||||
|
|
||||||
//shader input
|
//shader input
|
||||||
layout (location = 0) in vec2 in_uv;
|
layout (location = 0) in vec4 in_color;
|
||||||
layout (location = 1) in vec4 in_color;
|
layout (location = 1) in vec2 in_uv;
|
||||||
|
layout (location = 2) in flat uint texture_index;
|
||||||
|
|
||||||
//output write
|
//output write
|
||||||
layout (location = 0) out vec4 out_frag_color;
|
layout (location = 0) out vec4 out_frag_color;
|
||||||
|
|
||||||
layout(set = 0, binding = 0) uniform sampler2D atlas_texture;
|
layout(set = 0, binding = 0) uniform sampler2D textures[];
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
vec4 sampled = texture(atlas_texture, in_uv);
|
vec4 sampled = texture(textures[texture_index], in_uv);
|
||||||
out_frag_color = in_color * sampled;
|
out_frag_color = in_color * sampled;
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,9 @@
|
|||||||
#extension GL_EXT_buffer_reference : require
|
#extension GL_EXT_buffer_reference : require
|
||||||
#extension GL_EXT_debug_printf : require
|
#extension GL_EXT_debug_printf : require
|
||||||
|
|
||||||
layout (location = 0) out vec2 out_uv;
|
layout (location = 0) out vec4 out_color;
|
||||||
layout (location = 1) out vec4 out_color;
|
layout (location = 1) out vec2 out_uv;
|
||||||
|
layout (location = 2) out uint out_texture_index;
|
||||||
|
|
||||||
struct Vertex {
|
struct Vertex {
|
||||||
float x;
|
float x;
|
||||||
@ -11,6 +12,8 @@ struct Vertex {
|
|||||||
float uv_x;
|
float uv_x;
|
||||||
float uv_y;
|
float uv_y;
|
||||||
vec4 color;
|
vec4 color;
|
||||||
|
uint texture_index;
|
||||||
|
uint r[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
layout(buffer_reference, std430) readonly buffer VertexBuffer{
|
layout(buffer_reference, std430) readonly buffer VertexBuffer{
|
||||||
@ -33,9 +36,10 @@ void main()
|
|||||||
float height = PushConstants.height;
|
float height = PushConstants.height;
|
||||||
|
|
||||||
//output data
|
//output data
|
||||||
gl_Position = vec4(2 * v.x / width - 1, 1 - (2 * v.y) / height, 0.0, 1.0);
|
gl_Position = vec4(2 * v.x / width - 1, 1 - (2 * v.y) / height, 0, 1);
|
||||||
out_uv = vec2(v.uv_x, v.uv_y);
|
out_uv = vec2(v.uv_x, v.uv_y);
|
||||||
out_color = v.color;
|
out_color = v.color;
|
||||||
|
out_texture_index = v.texture_index;
|
||||||
//debugPrintfEXT("Position: (%f, %f, %f)\n", v.position.x, v.position.y, v.position.z);
|
//debugPrintfEXT("Position: (%f, %f, %f)\n", v.position.x, v.position.y, v.position.z);
|
||||||
//debugPrintfEXT("Color: (%f, %f, %f)\n", v.color.x, v.color.y, v.color.z);
|
//debugPrintfEXT("Color: (%f, %f, %f)\n", v.color.x, v.color.y, v.color.z);
|
||||||
}
|
}
|
||||||
|
@ -687,6 +687,7 @@ Renderer* renderer_initialize()
|
|||||||
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
|
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
|
||||||
.bufferDeviceAddress = 1,
|
.bufferDeviceAddress = 1,
|
||||||
.descriptorIndexing = 1,
|
.descriptorIndexing = 1,
|
||||||
|
.runtimeDescriptorArray = 1,
|
||||||
.pNext = &features13,
|
.pNext = &features13,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user