changed the pipeline to use 16 bit int as coords

thank you renderdoc for making me feel less stupid
This commit is contained in:
Alessandro Mauri 2025-06-03 09:16:51 +02:00
parent 712ce50631
commit 24bc2c67bc
5 changed files with 17 additions and 23 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ build/*
perf.data* perf.data*
*.rdc *.rdc
test_renderer test_renderer
resources/shaders/compiled/**

View File

@ -5,21 +5,24 @@ layout(set = 1, binding = 0) uniform Viewport {
ivec2 off; ivec2 off;
}; };
layout(location = 0) in vec2 position; layout(location = 0) in ivec2 position;
layout(location = 1) in vec2 uv; layout(location = 1) in ivec2 uv;
layout(location = 2) in ivec4 color; layout(location = 2) in ivec4 color;
layout(location = 0) out vec4 col; layout(location = 0) out vec4 col;
void main() void main()
{ {
//vec2 shift = vec2(0); // per vertex shift
vec2 shift; vec2 shift;
shift.x = float(off.x) / view.x; shift.x = float(off.x) / view.x;
shift.y = -(float(off.y) / view.y); shift.y = -(float(off.y) / view.y);
vec2 pos = position + shift; // vertex position
vec2 pos;
pos.x = float(position.x)*2.0 / view.x - 1.0;
pos.y = -(float(position.y)*2.0 / view.y - 1.0);
gl_Position = vec4(pos.x, pos.y, 0.0, 1.0); gl_Position = vec4(pos+shift, 0.0, 1.0);
col = vec4(color) / 255.0; col = vec4(color) / 255.0;
} }

View File

@ -51,10 +51,10 @@ struct Renderer {
// how each vertex is represented in the gpu // how each vertex is represented in the gpu
struct Vertex @packed { struct Vertex @packed {
struct pos { struct pos {
float x, y; short x, y;
} }
struct uv { struct uv {
float u, v; short u, v;
} }
struct col { // FIXME: this is shit struct col { // FIXME: this is shit
union { union {
@ -321,13 +321,13 @@ fn void Renderer.create_pipeline(&self, String shader_name, PipelineType type)
{ // at location zero there is the position of the vertex { // at location zero there is the position of the vertex
.location = 0, .location = 0,
.buffer_slot = 0, // only one buffer so always slot zero .buffer_slot = 0, // only one buffer so always slot zero
.format = GPU_VERTEXELEMENTFORMAT_FLOAT2, .format = GPU_VERTEXELEMENTFORMAT_SHORT2,
.offset = Vertex.pos.offsetof, .offset = Vertex.pos.offsetof,
}, },
{ // at location one there are the uv coordinates { // at location one there are the uv coordinates
.location = 1, .location = 1,
.buffer_slot = 0, .buffer_slot = 0,
.format = GPU_VERTEXELEMENTFORMAT_FLOAT2, .format = GPU_VERTEXELEMENTFORMAT_SHORT2,
.offset = Vertex.uv.offsetof, .offset = Vertex.uv.offsetof,
}, },
{ // at location two there is the color { // at location two there is the color
@ -500,12 +500,6 @@ fn void Renderer.update_texture(&self, String name, char[] pixels, ushort width,
} }
macro void Vertex.norm(&p, float w, float h)
{
p.pos.x = p.pos.x * 2.0 / w - 1.0;
p.pos.y = -(p.pos.y * 2.0 / h - 1.0);
}
// an highly inefficient way to draw a single quad, no batching, per-quad upload // an highly inefficient way to draw a single quad, no batching, per-quad upload
fn void Renderer.draw_rect(&self, short x, short y, short w, short h, uint color, String shader_name) fn void Renderer.draw_rect(&self, short x, short y, short w, short h, uint color, String shader_name)
{ {
@ -541,15 +535,11 @@ fn void Renderer.draw_rect(&self, short x, short y, short w, short h, uint color
* +-------------+ * +-------------+
* v2 v3 * v2 v3
*/ */
quad.vertices.v1 = {.pos = {.x = x, .y = y}, .col.u = color}; quad.vertices.v1 = {.pos = {.x = x, .y = y}, .col.u = color};
quad.vertices.v2 = {.pos = {.x = x, .y = (float)y+h}, .col.u = color}; quad.vertices.v2 = {.pos = {.x = x, .y = y+h}, .col.u = color};
quad.vertices.v3 = {.pos = {.x = (float)x+w, .y = (float)y+h}, .col.u = color}; quad.vertices.v3 = {.pos = {.x = x+w, .y = y+h}, .col.u = color};
quad.vertices.v4 = {.pos = {.x = (float)x+w, .y = y}, .col.u = color}; quad.vertices.v4 = {.pos = {.x = x+w, .y = y}, .col.u = color};
quad.vertices.v1.norm(640.0, 480.0);
quad.vertices.v2.norm(640.0, 480.0);
quad.vertices.v3.norm(640.0, 480.0);
quad.vertices.v4.norm(640.0, 480.0);
// triangle 1 // triangle 1
quad.indices.i1 = 0; // v1 quad.indices.i1 = 0; // v1