change names, fix some bugs, minor GL/D3D fixes, update tests, fix effect files, output a little more debug information

This commit is contained in:
jp9000
2013-10-14 12:37:52 -07:00
parent 1493a325bb
commit 9570f0b8d7
36 changed files with 530 additions and 357 deletions

View File

@@ -21,6 +21,8 @@
EXPORT device_t device_create(struct gs_init_data *data);
EXPORT void device_destroy(device_t device);
EXPORT void device_entercontext(device_t device);
EXPORT void device_leavecontext(device_t device);
EXPORT swapchain_t device_create_swapchain(device_t device,
struct gs_init_data *data);
EXPORT void device_resize(device_t device, uint32_t x, uint32_t y);

View File

@@ -22,7 +22,7 @@ bool gl_init_face(GLenum target, GLenum type, uint32_t num_levels,
uint32_t width, uint32_t height, uint32_t size, void ***p_data)
{
bool success = true;
void **data = *p_data;
void **data = p_data ? *p_data : NULL;
uint32_t i;
for (i = 0; i < num_levels; i++) {
@@ -50,7 +50,8 @@ bool gl_init_face(GLenum target, GLenum type, uint32_t num_levels,
if (height == 0) height = 1;
}
*p_data = data;
if (data)
*p_data = data;
return success;
}

View File

@@ -27,7 +27,7 @@ static inline bool gl_success(const char *funcname)
{
GLenum errorcode = glGetError();
if (errorcode != GL_NO_ERROR) {
blog(LOG_ERROR, "%s failed, glGetError returned %u",
blog(LOG_ERROR, "%s failed, glGetError returned 0x%X",
funcname, errorcode);
return false;
}

View File

@@ -36,7 +36,8 @@ static inline void shader_param_free(struct shader_param *param)
da_free(param->def_value);
}
static void gl_get_program_info(GLuint program, char **error_string)
static void gl_get_program_info(GLuint program, const char *file,
char **error_string)
{
char *errors;
GLint info_len = 0;
@@ -51,7 +52,12 @@ static void gl_get_program_info(GLuint program, char **error_string)
glGetProgramInfoLog(program, info_len, &chars_written, errors);
gl_success("glGetProgramInfoLog");
*error_string = errors;
blog(LOG_DEBUG, "Compiler warnings/errors for %s:\n%s", file, errors);
if (error_string)
*error_string = errors;
else
bfree(errors);
}
static bool gl_add_param(struct gs_shader *shader, struct shader_var *var,
@@ -195,6 +201,12 @@ static bool gl_shader_init(struct gs_shader *shader,
if (!shader->program)
return false;
blog(LOG_DEBUG, "+++++++++++++++++++++++++++++++++++");
blog(LOG_DEBUG, " GL shader string for: %s", file);
blog(LOG_DEBUG, "-----------------------------------");
blog(LOG_DEBUG, "%s", glsp->gl_string.array);
blog(LOG_DEBUG, "+++++++++++++++++++++++++++++++++++");
glGetProgramiv(shader->program, GL_VALIDATE_STATUS, &compiled);
if (!gl_success("glGetProgramiv"))
return false;
@@ -202,7 +214,7 @@ static bool gl_shader_init(struct gs_shader *shader,
if (!compiled)
success = false;
gl_get_program_info(shader->program, error_string);
gl_get_program_info(shader->program, file, error_string);
if (success)
success = gl_add_params(shader, glsp);

View File

@@ -417,7 +417,7 @@ static void gl_write_function(struct gl_shader_parser *glsp,
dstr_cat(&glsp->gl_string, " ");
if (strcmp(func->name, "main") == 0)
dstr_cat(&glsp->gl_string, "__main__");
dstr_cat(&glsp->gl_string, "obs_main_x");
else
dstr_cat(&glsp->gl_string, func->name);
@@ -521,7 +521,7 @@ static void gl_write_main(struct gl_shader_parser *glsp,
dstr_cat(&glsp->gl_string, main->params.array[i].type);
dstr_cat(&glsp->gl_string, " ");
dstr_cat(&glsp->gl_string, main->params.array[i].name);
dstr_cat(&glsp->gl_string, "\n");
dstr_cat(&glsp->gl_string, ";\n");
}
if (!main->mapping) {
@@ -534,7 +534,7 @@ static void gl_write_main(struct gl_shader_parser *glsp,
gl_write_main_storage_var(glsp, main->params.array, NULL,
"inputval_", true);
dstr_cat(&glsp->gl_string, "\n\toutputval = __main__(");
dstr_cat(&glsp->gl_string, "\n\toutputval = obs_main_x(");
for (i = 0; i < main->params.num; i++) {
if (i)
dstr_cat(&glsp->gl_string, ", ");

View File

@@ -28,7 +28,9 @@ static bool create_pixel_pack_buffer(struct gs_stage_surface *surf)
if (!gl_bind_buffer(GL_PIXEL_PACK_BUFFER, surf->pack_buffer))
return false;
size = surf->width * surf->height * surf->bytes_per_pixel;
size = surf->width * surf->bytes_per_pixel;
size = (size+3) & 0xFFFFFFFC; /* align width to 4-byte boundry */
size *= surf->height;
glBufferData(GL_PIXEL_PACK_BUFFER, size, 0, GL_DYNAMIC_READ);
if (!gl_success("glBufferData"))

View File

@@ -64,6 +64,7 @@ device_t device_create(struct gs_init_data *info)
blog(LOG_DEBUG, "OpenGL debug information not available");
#endif
device_leavecontext(device);
return device;
fail:

View File

@@ -52,8 +52,15 @@ static bool create_pixel_unpack_buffer(struct gs_texture_2d *tex)
if (!gl_bind_buffer(GL_PIXEL_UNPACK_BUFFER, tex->unpack_buffer))
return false;
size = tex->width * tex->height * gs_get_format_bpp(tex->base.format);
size /= 8;
size = tex->width * gs_get_format_bpp(tex->base.format);
if (!gs_is_compressed_format(tex->base.format)) {
size /= 8;
size = (size+3) & 0xFFFFFFFC;
size *= tex->height;
} else {
size *= tex->height;
size /= 8;
}
glBufferData(GL_PIXEL_UNPACK_BUFFER, size, 0, GL_DYNAMIC_DRAW);
if (!gl_success("glBufferData"))
@@ -75,6 +82,7 @@ texture_t device_create_texture(device_t device, uint32_t width,
tex->base.device = device;
tex->base.type = GS_TEXTURE_2D;
tex->base.format = color_format;
tex->base.levels = levels;
tex->base.gl_format = convert_gs_format(color_format);
tex->base.gl_internal_format = convert_gs_internal_format(color_format);
tex->base.gl_type = get_gl_format_type(color_format);

View File

@@ -63,6 +63,7 @@ texture_t device_create_cubetexture(device_t device, uint32_t size,
tex->base.device = device;
tex->base.type = GS_TEXTURE_CUBE;
tex->base.format = color_format;
tex->base.levels = levels;
tex->base.gl_format = convert_gs_format(color_format);
tex->base.gl_internal_format = convert_gs_internal_format(color_format);
tex->base.gl_target = GL_TEXTURE_CUBE_MAP;

View File

@@ -127,6 +127,16 @@ static inline HWND gl_create_dummy_window(void)
return hwnd;
}
static inline bool wgl_make_current(HDC hdc, HGLRC hglrc)
{
bool success = wglMakeCurrent(hdc, hglrc);
if (!success)
blog(LOG_ERROR, "wglMakeCurrent failed, GetLastError "
"returned %u", GetLastError());
return success;
}
static inline HGLRC gl_init_context(HDC hdc)
{
HGLRC hglrc = wglCreateContext(hdc);
@@ -135,8 +145,7 @@ static inline HGLRC gl_init_context(HDC hdc)
return NULL;
}
if (!wglMakeCurrent(hdc, hglrc)) {
blog(LOG_ERROR, "wglMakeCurrent failed, %u", GetLastError());
if (!wgl_make_current(hdc, hglrc)) {
wglDeleteContext(hglrc);
return NULL;
}
@@ -428,6 +437,21 @@ void gl_windowinfo_destroy(struct gl_windowinfo *wi)
}
}
void device_entercontext(device_t device)
{
HDC hdc = device->plat->swap.wi->hdc;
if (device->cur_swap)
hdc = device->cur_swap->wi->hdc;
if (!wgl_make_current(hdc, device->plat->hrc))
blog(LOG_ERROR, "device_load_swapchain (GL) failed");
}
void device_leavecontext(device_t device)
{
wglMakeCurrent(NULL, NULL);
}
void device_load_swapchain(device_t device, swapchain_t swap)
{
HDC hdc = device->plat->swap.wi->hdc;
@@ -439,11 +463,8 @@ void device_load_swapchain(device_t device, swapchain_t swap)
if (swap)
hdc = swap->wi->hdc;
if (!wglMakeCurrent(hdc, device->plat->hrc)) {
blog(LOG_ERROR, "wglMakeCurrent failed, GetLastError "
"returned %u", GetLastError());
if (!wgl_make_current(hdc, device->plat->hrc))
blog(LOG_ERROR, "device_load_swapchain (GL) failed");
}
}
void device_present(device_t device)