static void obs_source_draw_async_texture(struct obs_source *source) { effect_t effect = gs_geteffect(); bool yuv = format_is_yuv(source->async_format); bool limited_range = yuv && !source->async_full_range; const char *type = yuv ? "DrawMatrix" : "Draw"; bool def_draw = (!effect); technique_t tech; if (def_draw) { effect = obs_get_default_effect(); tech = effect_gettechnique(effect, type); technique_begin(tech); technique_beginpass(tech, 0); } obs_source_draw_texture(source, effect, yuv ? source->async_color_matrix : NULL, limited_range ? source->async_color_range_min : NULL, limited_range ? source->async_color_range_max : NULL); if (def_draw) { technique_endpass(tech); technique_end(tech); } }
void device_draw(device_t device, enum gs_draw_mode draw_mode, uint32_t start_vert, uint32_t num_verts) { try { if (!device->curVertexShader) throw "No vertex shader specified"; if (!device->curPixelShader) throw "No pixel shader specified"; if (!device->curVertexBuffer) throw "No vertex buffer specified"; effect_t effect = gs_geteffect(); if (effect) effect_updateparams(effect); device->UpdateBlendState(); device->UpdateRasterState(); device->UpdateZStencilState(); device->UpdateViewProjMatrix(); device->curVertexShader->UploadParams(); device->curPixelShader->UploadParams(); } catch (const char *error) { blog(LOG_ERROR, "device_draw (D3D11): %s", error); return; } catch (HRError error) { blog(LOG_ERROR, "device_draw (D3D11): %s (%08lX)", error.str, error.hr); return; } D3D10_PRIMITIVE_TOPOLOGY newTopology = ConvertGSTopology(draw_mode); if (device->curToplogy != newTopology) { device->context->IASetPrimitiveTopology(newTopology); device->curToplogy = newTopology; } if (device->curIndexBuffer) { if (num_verts == 0) num_verts = (uint32_t)device->curIndexBuffer->num; device->context->DrawIndexed(num_verts, start_vert, 0); } else { if (num_verts == 0) num_verts = (uint32_t)device->curVertexBuffer->numVerts; device->context->Draw(num_verts, start_vert); } }
static inline void obs_source_main_render(obs_source_t source) { uint32_t flags = source->info.output_flags; bool color_matrix = (flags & OBS_SOURCE_COLOR_MATRIX) != 0; bool custom_draw = (flags & OBS_SOURCE_CUSTOM_DRAW) != 0; bool default_effect = !source->filter_parent && source->filters.num == 0 && !custom_draw; if (default_effect) obs_source_default_render(source, color_matrix); else source->info.video_render(source->context.data, custom_draw ? NULL : gs_geteffect()); }
void xcursor_render(xcursor_t *data) { /* TODO: why do i need effects ? */ effect_t effect = gs_geteffect(); eparam_t image = effect_getparambyname(effect, "image"); effect_settexture(image, data->tex); gs_matrix_push(); gs_matrix_translate3f(-data->pos_x, -data->pos_y, 0); gs_enable_blending(True); gs_blendfunction(GS_BLEND_ONE, GS_BLEND_INVSRCALPHA); gs_draw_sprite(data->tex, 0, 0, 0); gs_matrix_pop(); }
void device_draw(device_t device, enum gs_draw_mode draw_mode, uint32_t start_vert, uint32_t num_verts) { struct gs_index_buffer *ib = device->cur_index_buffer; GLenum topology = convert_gs_topology(draw_mode); effect_t effect = gs_geteffect(); if (!can_render(device)) goto fail; if (effect) effect_updateparams(effect); shader_update_textures(device->cur_pixel_shader); update_viewproj_matrix(device); #ifdef _DEBUG if (!check_shader_pipeline_validity(device)) goto fail; #endif if (ib) { if (num_verts == 0) num_verts = (uint32_t)device->cur_index_buffer->num; glDrawElements(topology, num_verts, ib->gl_type, (const GLvoid*)(start_vert * ib->width)); if (!gl_success("glDrawElements")) goto fail; } else { if (num_verts == 0) num_verts = (uint32_t)device->cur_vertex_buffer->num; glDrawArrays(topology, start_vert, num_verts); if (!gl_success("glDrawArrays")) goto fail; } return; fail: blog(LOG_ERROR, "device_draw (GL) failed"); }