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:
@@ -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);
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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, ", ");
|
||||
|
@@ -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"))
|
||||
|
@@ -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:
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user