Imported Upstream version 0.14.2+dfsg1
This commit is contained in:
parent
fb3990e9e5
commit
41a01dbf05
529 changed files with 25112 additions and 2336 deletions
|
|
@ -22,8 +22,8 @@ static inline bool init_ib(struct gs_index_buffer *ib)
|
|||
GLenum usage = ib->dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW;
|
||||
bool success;
|
||||
|
||||
success = gl_create_buffer(GL_ARRAY_BUFFER, &ib->buffer, ib->size,
|
||||
ib->data, usage);
|
||||
success = gl_create_buffer(GL_ELEMENT_ARRAY_BUFFER, &ib->buffer,
|
||||
ib->size, ib->data, usage);
|
||||
|
||||
if (!ib->dynamic) {
|
||||
bfree(ib->data);
|
||||
|
|
@ -77,7 +77,8 @@ void gs_indexbuffer_flush(gs_indexbuffer_t *ib)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (!update_buffer(GL_ARRAY_BUFFER, ib->buffer, ib->data, ib->size))
|
||||
if (!update_buffer(GL_ELEMENT_ARRAY_BUFFER, ib->buffer, ib->data,
|
||||
ib->size))
|
||||
goto fail;
|
||||
|
||||
return;
|
||||
|
|
@ -103,11 +104,5 @@ enum gs_index_type gs_indexbuffer_get_type(const gs_indexbuffer_t *ib)
|
|||
|
||||
void device_load_indexbuffer(gs_device_t *device, gs_indexbuffer_t *ib)
|
||||
{
|
||||
if (ib == device->cur_index_buffer)
|
||||
return;
|
||||
|
||||
device->cur_index_buffer = ib;
|
||||
|
||||
if (!gl_bind_buffer(GL_ELEMENT_ARRAY_BUFFER, ib->buffer))
|
||||
blog(LOG_ERROR, "device_load_indexbuffer (GL) failed");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,6 +63,12 @@ static bool gl_write_type_n(struct gl_shader_parser *glsp,
|
|||
dstr_cat(&glsp->gl_string, "vec3");
|
||||
else if (cmp_type(type, len, "float4", 6) == 0)
|
||||
dstr_cat(&glsp->gl_string, "vec4");
|
||||
else if (cmp_type(type, len, "int2", 4) == 0)
|
||||
dstr_cat(&glsp->gl_string, "ivec2");
|
||||
else if (cmp_type(type, len, "int3", 4) == 0)
|
||||
dstr_cat(&glsp->gl_string, "ivec3");
|
||||
else if (cmp_type(type, len, "int4", 4) == 0)
|
||||
dstr_cat(&glsp->gl_string, "ivec4");
|
||||
else if (cmp_type(type, len, "float3x3", 8) == 0)
|
||||
dstr_cat(&glsp->gl_string, "mat3x3");
|
||||
else if (cmp_type(type, len, "float3x4", 8) == 0)
|
||||
|
|
@ -294,20 +300,21 @@ static bool gl_write_saturate(struct gl_shader_parser *glsp,
|
|||
}
|
||||
|
||||
static inline bool gl_write_texture_call(struct gl_shader_parser *glsp,
|
||||
struct shader_var *var, const char *call)
|
||||
struct shader_var *var, const char *call, bool sampler)
|
||||
{
|
||||
struct cf_parser *cfp = &glsp->parser.cfp;
|
||||
size_t sampler_id = (size_t)-1;
|
||||
|
||||
if (!cf_next_token(cfp)) return false;
|
||||
if (!cf_token_is(cfp, "(")) return false;
|
||||
if (!cf_next_token(cfp)) return false;
|
||||
|
||||
sampler_id = sp_getsampler(glsp, cfp->cur_token);
|
||||
if (sampler_id == (size_t)-1) return false;
|
||||
|
||||
if (!cf_next_token(cfp)) return false;
|
||||
if (!cf_token_is(cfp, ",")) return false;
|
||||
if (sampler) {
|
||||
if (!cf_next_token(cfp)) return false;
|
||||
sampler_id = sp_getsampler(glsp, cfp->cur_token);
|
||||
if (sampler_id == (size_t) -1) return false;
|
||||
if (!cf_next_token(cfp)) return false;
|
||||
if (!cf_token_is(cfp, ",")) return false;
|
||||
}
|
||||
|
||||
var->gl_sampler_id = sampler_id;
|
||||
|
||||
|
|
@ -330,14 +337,21 @@ static bool gl_write_texture_code(struct gl_shader_parser *glsp,
|
|||
if (!cf_token_is(cfp, ".")) return false;
|
||||
if (!cf_next_token(cfp)) return false;
|
||||
|
||||
const char *function_end = ")";
|
||||
|
||||
if (cf_token_is(cfp, "Sample"))
|
||||
written = gl_write_texture_call(glsp, var, "texture");
|
||||
written = gl_write_texture_call(glsp, var, "texture", true);
|
||||
else if (cf_token_is(cfp, "SampleBias"))
|
||||
written = gl_write_texture_call(glsp, var, "texture");
|
||||
written = gl_write_texture_call(glsp, var, "texture", true);
|
||||
else if (cf_token_is(cfp, "SampleGrad"))
|
||||
written = gl_write_texture_call(glsp, var, "textureGrad");
|
||||
written = gl_write_texture_call(glsp, var, "textureGrad", true);
|
||||
else if (cf_token_is(cfp, "SampleLevel"))
|
||||
written = gl_write_texture_call(glsp, var, "textureLod");
|
||||
written = gl_write_texture_call(glsp, var, "textureLod", true);
|
||||
else if (cf_token_is(cfp, "Load")) {
|
||||
written = gl_write_texture_call(glsp, var, "texelFetch", false);
|
||||
dstr_cat(&glsp->gl_string, "(");
|
||||
function_end = ").xy, 0)";
|
||||
}
|
||||
|
||||
if (!written)
|
||||
return false;
|
||||
|
|
@ -345,7 +359,7 @@ static bool gl_write_texture_code(struct gl_shader_parser *glsp,
|
|||
if (!cf_next_token(cfp)) return false;
|
||||
|
||||
gl_write_function_contents(glsp, &cfp->cur_token, ")");
|
||||
dstr_cat(&glsp->gl_string, ")");
|
||||
dstr_cat(&glsp->gl_string, function_end);
|
||||
|
||||
*p_token = cfp->cur_token;
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -470,7 +470,11 @@ void device_load_texture(gs_device_t *device, gs_texture_t *tex, int unit)
|
|||
if (!tex)
|
||||
return;
|
||||
|
||||
sampler = device->cur_samplers[param->sampler_id];
|
||||
// texelFetch doesn't need a sampler
|
||||
if (param->sampler_id != (size_t)-1)
|
||||
sampler = device->cur_samplers[param->sampler_id];
|
||||
else
|
||||
sampler = NULL;
|
||||
|
||||
if (!gl_bind_texture(tex->gl_target, tex->texture))
|
||||
goto fail;
|
||||
|
|
@ -975,7 +979,7 @@ void device_draw(gs_device_t *device, enum gs_draw_mode draw_mode,
|
|||
if (!program)
|
||||
goto fail;
|
||||
|
||||
load_vb_buffers(program, device->cur_vertex_buffer);
|
||||
load_vb_buffers(program, device->cur_vertex_buffer, ib);
|
||||
|
||||
if (program != device->cur_program && device->cur_program) {
|
||||
glUseProgram(0);
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ enum copy_type {
|
|||
static inline GLint convert_gs_format(enum gs_color_format format)
|
||||
{
|
||||
switch (format) {
|
||||
case GS_A8: return GL_RGBA;
|
||||
case GS_A8: return GL_RED;
|
||||
case GS_R8: return GL_RED;
|
||||
case GS_RGBA: return GL_RGBA;
|
||||
case GS_BGRX: return GL_BGRA;
|
||||
|
|
@ -377,7 +377,7 @@ struct gs_vertex_buffer {
|
|||
};
|
||||
|
||||
extern bool load_vb_buffers(struct gs_program *program,
|
||||
struct gs_vertex_buffer *vb);
|
||||
struct gs_vertex_buffer *vb, struct gs_index_buffer *ib);
|
||||
|
||||
struct gs_index_buffer {
|
||||
GLuint buffer;
|
||||
|
|
|
|||
|
|
@ -234,7 +234,8 @@ static bool load_vb_buffer(struct shader_attrib *attrib,
|
|||
return success;
|
||||
}
|
||||
|
||||
bool load_vb_buffers(struct gs_program *program, struct gs_vertex_buffer *vb)
|
||||
bool load_vb_buffers(struct gs_program *program, struct gs_vertex_buffer *vb,
|
||||
struct gs_index_buffer *ib)
|
||||
{
|
||||
struct gs_shader *shader = program->vertex_shader;
|
||||
size_t i;
|
||||
|
|
@ -248,6 +249,9 @@ bool load_vb_buffers(struct gs_program *program, struct gs_vertex_buffer *vb)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (ib && !gl_bind_buffer(GL_ELEMENT_ARRAY_BUFFER, ib->buffer))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue