YAGL_GET_CTX(glAttachShader);
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
shader_obj = (struct yagl_gles2_shader*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_SHADER, shader);
+ YAGL_NS_SHADER_PROGRAM, shader);
if (!shader_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (!shader_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (!yagl_gles2_program_attach_shader(program_obj, shader_obj, shader)) {
YAGL_SET_ERR(GL_INVALID_OPERATION);
goto out;
YAGL_GET_CTX(glBindAttribLocation);
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (name_) {
name = yagl_mem_get_string(gles2_api_ts->ts, name_);
if (!name) {
YAGL_GET_CTX(glCompileShader);
shader_obj = (struct yagl_gles2_shader*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_SHADER, shader);
+ YAGL_NS_SHADER_PROGRAM, shader);
if (!shader_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (!shader_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
yagl_gles2_shader_compile(shader_obj);
out:
goto out;
}
- *retval = yagl_sharegroup_add(ctx->sg, YAGL_NS_PROGRAM, &program->base);
+ *retval = yagl_sharegroup_add(ctx->sg, YAGL_NS_SHADER_PROGRAM, &program->base);
out:
yagl_gles2_program_release(program);
goto out;
}
- *retval = yagl_sharegroup_add(ctx->sg, YAGL_NS_SHADER, &shader->base);
+ *retval = yagl_sharegroup_add(ctx->sg, YAGL_NS_SHADER_PROGRAM, &shader->base);
out:
yagl_gles2_shader_release(shader);
bool yagl_host_glDeleteProgram(GLuint program)
{
+ struct yagl_gles2_program *program_obj = NULL;
+
YAGL_GET_CTX(glDeleteProgram);
+ if (program == 0) {
+ goto out;
+ }
+
+ program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
+ YAGL_NS_SHADER_PROGRAM, program);
+
+ if (!program_obj) {
+ YAGL_SET_ERR(GL_INVALID_VALUE);
+ goto out;
+ }
+
+ if (program_obj->is_shader) {
+ goto out;
+ }
+
yagl_gles2_context_unuse_program(ctx, program);
- yagl_sharegroup_remove(ctx->sg,
- YAGL_NS_PROGRAM,
- program);
+ yagl_sharegroup_remove_check(ctx->sg,
+ YAGL_NS_SHADER_PROGRAM,
+ program,
+ &program_obj->base);
+
+out:
+ yagl_gles2_program_release(program_obj);
return true;
}
bool yagl_host_glDeleteShader(GLuint shader)
{
+ struct yagl_gles2_shader *shader_obj = NULL;
+
YAGL_GET_CTX(glDeleteShader);
- yagl_sharegroup_remove(ctx->sg,
- YAGL_NS_SHADER,
- shader);
+ if (shader == 0) {
+ goto out;
+ }
+
+ shader_obj = (struct yagl_gles2_shader*)yagl_sharegroup_acquire_object(ctx->sg,
+ YAGL_NS_SHADER_PROGRAM, shader);
+
+ if (!shader_obj) {
+ YAGL_SET_ERR(GL_INVALID_VALUE);
+ goto out;
+ }
+
+ if (!shader_obj->is_shader) {
+ goto out;
+ }
+
+ yagl_sharegroup_remove_check(ctx->sg,
+ YAGL_NS_SHADER_PROGRAM,
+ shader,
+ &shader_obj->base);
+
+out:
+ yagl_gles2_shader_release(shader_obj);
return true;
}
YAGL_GET_CTX(glDetachShader);
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
shader_obj = (struct yagl_gles2_shader*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_SHADER, shader);
+ YAGL_NS_SHADER_PROGRAM, shader);
if (!shader_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (!shader_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (!yagl_gles2_program_detach_shader(program_obj, shader_obj, shader)) {
YAGL_SET_ERR(GL_INVALID_OPERATION);
goto out;
YAGL_GET_CTX(glGenFramebuffers);
+ if (n < 0) {
+ YAGL_SET_ERR(GL_INVALID_VALUE);
+ goto out;
+ }
+
if (!yagl_mem_prepare(gles2_api_ts->ts->mt1, framebuffers_, n * sizeof(*framebuffer_names))) {
res = false;
goto out;
YAGL_GET_CTX(glGenRenderbuffers);
+ if (n < 0) {
+ YAGL_SET_ERR(GL_INVALID_VALUE);
+ goto out;
+ }
+
if (!yagl_mem_prepare(gles2_api_ts->ts->mt1, renderbuffers_, n * sizeof(*renderbuffer_names))) {
res = false;
goto out;
YAGL_GET_CTX(glGetActiveAttrib);
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (bufsize > 0) {
name = yagl_gles_context_malloc(&ctx->base, bufsize);
}
YAGL_GET_CTX(glGetActiveUniform);
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (bufsize > 0) {
name = yagl_gles_context_malloc(&ctx->base, bufsize);
}
YAGL_GET_CTX(glGetAttachedShaders);
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (maxcount < 0) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
*retval = 0;
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (name_) {
name = yagl_mem_get_string(gles2_api_ts->ts, name_);
if (!name) {
}
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (params_) {
if (!yagl_mem_get_GLint(gles2_api_ts->ts, params_, ¶ms)) {
res = false;
YAGL_GET_CTX(glGetProgramInfoLog);
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (bufsize < 0) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
shader_obj = (struct yagl_gles2_shader*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_SHADER, shader);
+ YAGL_NS_SHADER_PROGRAM, shader);
if (!shader_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (!shader_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (params_) {
if (!yagl_mem_get_GLint(gles2_api_ts->ts, params_, ¶ms)) {
res = false;
YAGL_GET_CTX(glGetShaderInfoLog);
shader_obj = (struct yagl_gles2_shader*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_SHADER, shader);
+ YAGL_NS_SHADER_PROGRAM, shader);
if (!shader_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (!shader_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (bufsize < 0) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
YAGL_GET_CTX(glGetShaderSource);
shader_obj = (struct yagl_gles2_shader*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_SHADER, shader);
+ YAGL_NS_SHADER_PROGRAM, shader);
if (!shader_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (!shader_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (bufsize < 0) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
*retval = 0;
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
if (name_) {
name = yagl_mem_get_string(gles2_api_ts->ts, name_);
if (!name) {
*retval = GL_FALSE;
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (program_obj) {
- *retval = GL_TRUE;
+ *retval = program_obj->is_shader ? GL_FALSE : GL_TRUE;
}
yagl_gles2_program_release(program_obj);
*retval = GL_FALSE;
shader_obj = (struct yagl_gles2_shader*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_SHADER, shader);
+ YAGL_NS_SHADER_PROGRAM, shader);
if (shader_obj) {
- *retval = GL_TRUE;
+ *retval = shader_obj->is_shader ? GL_TRUE : GL_FALSE;
}
yagl_gles2_shader_release(shader_obj);
YAGL_GET_CTX(glLinkProgram);
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
yagl_gles2_program_link(program_obj);
out:
}
shader_obj = (struct yagl_gles2_shader*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_SHADER, shader);
+ YAGL_NS_SHADER_PROGRAM, shader);
if (!shader_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (!shader_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
string_ptrs = g_malloc(count * sizeof(*string_ptrs));
if (!yagl_mem_get(gles2_api_ts->ts, string_, count * sizeof(*string_ptrs), string_ptrs)) {
res = false;
if (program != 0) {
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
}
yagl_gles2_context_use_program(ctx, program);
YAGL_GET_CTX(glValidateProgram);
program_obj = (struct yagl_gles2_program*)yagl_sharegroup_acquire_object(ctx->sg,
- YAGL_NS_PROGRAM, program);
+ YAGL_NS_SHADER_PROGRAM, program);
if (!program_obj) {
YAGL_SET_ERR(GL_INVALID_VALUE);
goto out;
}
+ if (program_obj->is_shader) {
+ YAGL_SET_ERR(GL_INVALID_OPERATION);
+ goto out;
+ }
+
yagl_gles2_program_validate(program_obj);
out: