Imported Upstream version 0.14.2+dfsg1

This commit is contained in:
Sebastian Ramacher 2016-05-24 21:53:01 +02:00
parent fb3990e9e5
commit 41a01dbf05
529 changed files with 25112 additions and 2336 deletions

View file

@ -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");
}

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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;
}