Skip to content

Commit d689570

Browse files
authored
Merge pull request #21 from cloudwu/drawex
Use sg_draw_ex()
2 parents 649fe87 + 3299b25 commit d689570

9 files changed

Lines changed: 153 additions & 47 deletions

File tree

src/material_default.c

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "batch.h"
1010
#include "spritemgr.h"
1111
#include "material_util.h"
12+
#include "render_bindings.h"
1213

1314
#define BATCHN 4096
1415

@@ -27,7 +28,7 @@ struct buffer_data {
2728
struct material_default {
2829
sg_pipeline pip;
2930
sg_buffer inst;
30-
sg_bindings *bind;
31+
struct soluna_render_bindings *bind;
3132
vs_params_t *uniform;
3233
struct sr_buffer *srbuffer;
3334
struct sprite_bank *bank;
@@ -75,23 +76,41 @@ lmaterial_default_submit(lua_State *L) {
7576
return 0;
7677
}
7778

78-
static int
79-
lmaterial_default_draw(lua_State *L) {
79+
static inline int
80+
lmaterial_default_draw_(lua_State *L, int ex) {
8081
struct material_default *m = (struct material_default *)luaL_checkudata(L, 1, "SOLUNA_MATERIAL_DEFAULT");
8182
// struct draw_primitive *prim = lua_touserdata(L, 2);
8283
int prim_n = luaL_checkinteger(L, 3);
8384
// int tex_id = luaL_checkinteger(L, 4);
8485

8586
sg_apply_pipeline(m->pip);
8687
sg_apply_uniforms(UB_vs_params, &(sg_range){ m->uniform, sizeof(vs_params_t) });
87-
sg_apply_bindings(m->bind);
88-
sg_draw(0, 4, prim_n);
8988

90-
m->bind->vertex_buffer_offsets[0] += prim_n * sizeof(struct inst_object);
89+
if (ex) {
90+
sg_apply_bindings(&m->bind->bindings);
91+
sg_draw_ex(0, 4, prim_n, 0, m->bind->base);
92+
} else {
93+
size_t base = m->bind->base * sizeof(struct inst_object);
94+
m->bind->bindings.vertex_buffer_offsets[0] += base;
95+
sg_apply_bindings(&m->bind->bindings);
96+
sg_draw(0, 4, prim_n);
97+
m->bind->bindings.vertex_buffer_offsets[0] -= base;
98+
}
99+
m->bind->base += prim_n;
91100

92101
return 0;
93102
}
94103

104+
static int
105+
lmaterial_default_draw(lua_State *L) {
106+
return lmaterial_default_draw_(L, 0);
107+
}
108+
109+
static int
110+
lmaterial_default_draw_ex(lua_State *L) {
111+
return lmaterial_default_draw_(L, 1);
112+
}
113+
95114
static void
96115
init_pipeline(struct material_default *p) {
97116
sg_shader shd = sg_make_shader(texquad_shader_desc(sg_query_backend()));
@@ -144,7 +163,7 @@ lnew_material_default(lua_State *L) {
144163
luaL_Reg l[] = {
145164
{ "__index", NULL },
146165
{ "submit", lmaterial_default_submit },
147-
{ "draw", lmaterial_default_draw },
166+
{ "draw", DRAWFUNC(lmaterial_default_draw) },
148167
{ NULL, NULL },
149168
};
150169
luaL_setfuncs(L, l, 0);

src/material_mask.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "batch.h"
1010
#include "spritemgr.h"
1111
#include "material_util.h"
12+
#include "render_bindings.h"
1213

1314
#define BATCHN 4096
1415

@@ -37,7 +38,7 @@ struct buffer_data {
3738
struct material_mask {
3839
sg_pipeline pip;
3940
sg_buffer inst;
40-
sg_bindings *bind;
41+
struct soluna_render_bindings *bind;
4142
vs_params_t *uniform;
4243
struct sr_buffer *srbuffer;
4344
struct sprite_bank *bank;
@@ -89,23 +90,42 @@ lmaterial_mask_submit(lua_State *L) {
8990
return 0;
9091
}
9192

92-
static int
93-
lmaterial_mask_draw(lua_State *L) {
93+
static inline int
94+
lmaterial_mask_draw_(lua_State *L, int ex) {
9495
struct material_mask *m = (struct material_mask *)luaL_checkudata(L, 1, "SOLUNA_MATERIAL_MASK");
9596
// struct draw_primitive *prim = lua_touserdata(L, 2);
9697
int prim_n = luaL_checkinteger(L, 3);
9798
// int tex_id = luaL_checkinteger(L, 4);
9899

99100
sg_apply_pipeline(m->pip);
100101
sg_apply_uniforms(UB_vs_params, &(sg_range){ m->uniform, sizeof(vs_params_t) });
101-
sg_apply_bindings(m->bind);
102-
sg_draw(0, 4, prim_n);
103102

104-
m->bind->vertex_buffer_offsets[0] += prim_n * sizeof(struct inst_object);
103+
if (ex) {
104+
sg_apply_bindings(&m->bind->bindings);
105+
sg_draw_ex(0, 4, prim_n, 0, m->bind->base);
106+
} else {
107+
size_t base = m->bind->base * sizeof(struct inst_object);
108+
m->bind->bindings.vertex_buffer_offsets[0] += base;
109+
sg_apply_bindings(&m->bind->bindings);
110+
sg_draw(0, 4, prim_n);
111+
m->bind->bindings.vertex_buffer_offsets[0] -= base;
112+
}
113+
114+
m->bind->base += prim_n;
105115

106116
return 0;
107117
}
108118

119+
static int
120+
lmaterial_mask_draw(lua_State *L) {
121+
return lmaterial_mask_draw_(L, 0);
122+
}
123+
124+
static int
125+
lmaterial_mask_draw_ex(lua_State *L) {
126+
return lmaterial_mask_draw_(L, 1);
127+
}
128+
109129
static void
110130
init_pipeline(struct material_mask *p) {
111131
sg_shader shd = sg_make_shader(maskquad_shader_desc(sg_query_backend()));
@@ -159,7 +179,7 @@ lnew_material_mask(lua_State *L) {
159179
luaL_Reg l[] = {
160180
{ "__index", NULL },
161181
{ "submit", lmaterial_mask_submit },
162-
{ "draw", lmaterial_mask_draw },
182+
{ "draw", DRAWFUNC(lmaterial_mask_draw) },
163183
{ NULL, NULL },
164184
};
165185
luaL_setfuncs(L, l, 0);

src/material_quad.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "batch.h"
1010
#include "spritemgr.h"
1111
#include "material_util.h"
12+
#include "render_bindings.h"
1213

1314
#define BATCHN 4096
1415

@@ -37,7 +38,7 @@ struct buffer_data {
3738
struct material_quad {
3839
sg_pipeline pip;
3940
sg_buffer inst;
40-
sg_bindings *bind;
41+
struct soluna_render_bindings *bind;
4142
vs_params_t *uniform;
4243
struct sr_buffer *srbuffer;
4344
};
@@ -83,8 +84,8 @@ lmateraial_quad_submit(lua_State *L) {
8384
return 0;
8485
}
8586

86-
static int
87-
lmateraial_quad_draw(lua_State *L) {
87+
static inline int
88+
lmateraial_quad_draw_(lua_State *L, int ex) {
8889
struct material_quad *m = (struct material_quad *)luaL_checkudata(L, 1, "SOLUNA_MATERIAL_QUAD");
8990
// struct draw_primitive *prim = lua_touserdata(L, 2);
9091
int prim_n = luaL_checkinteger(L, 3);
@@ -93,13 +94,32 @@ lmateraial_quad_draw(lua_State *L) {
9394

9495
sg_apply_pipeline(m->pip);
9596
sg_apply_uniforms(UB_vs_params, &(sg_range){ m->uniform, sizeof(vs_params_t) });
96-
sg_apply_bindings(m->bind);
97-
sg_draw(0, 4, prim_n);
98-
m->bind->vertex_buffer_offsets[0] += prim_n * sizeof(struct inst_object);
97+
if (ex) {
98+
sg_apply_bindings(&m->bind->bindings);
99+
sg_draw_ex(0, 4, prim_n, 0, m->bind->base);
100+
} else {
101+
size_t base = m->bind->base * sizeof(struct inst_object);
102+
m->bind->bindings.vertex_buffer_offsets[0] += base;
103+
sg_apply_bindings(&m->bind->bindings);
104+
sg_draw(0, 4, prim_n);
105+
m->bind->bindings.vertex_buffer_offsets[0] -= base;
106+
}
107+
108+
m->bind->base += prim_n;
99109

100110
return 0;
101111
}
102112

113+
static int
114+
lmateraial_quad_draw(lua_State *L) {
115+
return lmateraial_quad_draw_(L, 0);
116+
}
117+
118+
static int
119+
lmateraial_quad_draw_ex(lua_State *L) {
120+
return lmateraial_quad_draw_(L, 1);
121+
}
122+
103123
static void
104124
init_pipeline(struct material_quad *m) {
105125
sg_shader shd = sg_make_shader(colorquad_shader_desc(sg_query_backend()));
@@ -146,7 +166,7 @@ lnew_material_quad(lua_State *L) {
146166
luaL_Reg l[] = {
147167
{ "__index", NULL },
148168
{ "submit", lmateraial_quad_submit },
149-
{ "draw", lmateraial_quad_draw },
169+
{ "draw", DRAWFUNC(lmateraial_quad_draw) },
150170
{ NULL, NULL },
151171
};
152172
luaL_setfuncs(L, l, 0);

src/material_text.c

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "font_manager.h"
1515
#include "sprite_submit.h"
1616
#include "material_util.h"
17+
#include "render_bindings.h"
1718

1819
#define BATCHN 4096
1920

@@ -40,7 +41,7 @@ struct buffer_data {
4041
struct material_text {
4142
sg_pipeline pip;
4243
sg_buffer inst;
43-
sg_bindings *bind;
44+
struct soluna_render_bindings *bind;
4445
vs_params_t *uniform;
4546
struct sr_buffer *srbuffer;
4647
struct font_manager *font;
@@ -97,19 +98,27 @@ lmateraial_text_submit(lua_State *L) {
9798
return 0;
9899
}
99100

100-
static void
101-
draw_text(struct material_text *m, uint32_t color, int count) {
101+
static inline void
102+
draw_text(struct material_text *m, uint32_t color, int count, int ex) {
102103
m->fs_uniform.color = color;
103104
sg_apply_uniforms(UB_vs_params, &(sg_range){ m->uniform, sizeof(vs_params_t) });
104105
sg_apply_uniforms(UB_fs_params, &(sg_range){ &m->fs_uniform, sizeof(fs_params_t) });
105-
sg_apply_bindings(m->bind);
106-
sg_draw(0, 4, count);
107-
108-
m->bind->vertex_buffer_offsets[0] += count * sizeof(struct inst_object);
106+
if (ex) {
107+
sg_apply_bindings(&m->bind->bindings);
108+
sg_draw_ex(0, 4, count, 0, m->bind->base);
109+
} else {
110+
size_t base = m->bind->base * sizeof(struct inst_object);
111+
m->bind->bindings.vertex_buffer_offsets[0] += base;
112+
sg_apply_bindings(&m->bind->bindings);
113+
sg_draw(0, 4, count);
114+
m->bind->bindings.vertex_buffer_offsets[0] -= base;
115+
}
116+
117+
m->bind->base += count;
109118
}
110119

111-
static int
112-
lmateraial_text_draw(lua_State *L) {
120+
static inline int
121+
lmateraial_text_draw_(lua_State *L, int ex) {
113122
struct material_text *m = (struct material_text *)luaL_checkudata(L, 1, "SOLUNA_MATERIAL_TEXT");
114123
struct draw_primitive *prim = lua_touserdata(L, 2);
115124
int prim_n = luaL_checkinteger(L, 3);
@@ -130,21 +139,31 @@ lmateraial_text_draw(lua_State *L) {
130139
color = t->color;
131140
count = 1;
132141
} else if (t->color != color) {
133-
draw_text(m, color, count);
142+
draw_text(m, color, count, ex);
134143
color = t->color;
135144
count = 1;
136145
} else {
137146
++count;
138147
}
139148
}
140149
}
141-
draw_text(m, color, count);
150+
draw_text(m, color, count, ex);
142151

143152
m->uniform->texsize = texsize;
144153

145154
return 0;
146155
}
147156

157+
static int
158+
lmateraial_text_draw(lua_State *L) {
159+
return lmateraial_text_draw_(L, 0);
160+
}
161+
162+
static int
163+
lmateraial_text_draw_ex(lua_State *L) {
164+
return lmateraial_text_draw_(L, 1);
165+
}
166+
148167
static void
149168
init_pipeline(struct material_text *m) {
150169
sg_shader shd = sg_make_shader(texquad_shader_desc(sg_query_backend()));
@@ -205,7 +224,7 @@ lnew_material_text_normal(lua_State *L) {
205224
luaL_Reg l[] = {
206225
{ "__index", NULL },
207226
{ "submit", lmateraial_text_submit },
208-
{ "draw", lmateraial_text_draw },
227+
{ "draw", DRAWFUNC(lmateraial_text_draw) },
209228
{ NULL, NULL },
210229
};
211230
luaL_setfuncs(L, l, 0);

src/render.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ get_buffer_data(lua_State *L, int index, size_t *sz) {
113113
if (size > 0 && size != rawlen)
114114
luaL_error(L, "size of string %d != %d", rawlen, size);
115115
lua_pop(L, 1);
116-
*sz = size;
116+
*sz = rawlen;
117117
return ptr;
118118
}
119119
luaL_error(L, "Invalid .data type = %s", lua_typename(L, t));

0 commit comments

Comments
 (0)