void device_draw(gs_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); gs_effect_t *effect = gs_get_effect(); struct gs_program *program; if (!can_render(device)) goto fail; if (effect) gs_effect_update_params(effect); program = get_shader_program(device); if (!program) goto fail; load_vb_buffers(program, device->cur_vertex_buffer); if (program != device->cur_program && device->cur_program) { glUseProgram(0); gl_success("glUseProgram (zero)"); } if (program != device->cur_program) { device->cur_program = program; glUseProgram(program->obj); if (!gl_success("glUseProgram")) goto fail; } update_viewproj_matrix(device); program_update_params(program); 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"); }
void device_draw(gs_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"; gs_effect_t effect = gs_get_effect(); if (effect) gs_effect_update_params(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; } D3D11_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); } }
void xcursor_render(xcursor_t *data) { gs_effect_t *effect = gs_get_effect(); gs_eparam_t *image = gs_effect_get_param_by_name(effect, "image"); gs_effect_set_texture(image, data->tex); gs_matrix_push(); gs_matrix_translate3f(data->render_x, data->render_y, 0.0f); gs_enable_blending(True); gs_blend_function(GS_BLEND_ONE, GS_BLEND_INVSRCALPHA); gs_draw_sprite(data->tex, 0, 0, 0); gs_matrix_pop(); }
void xcursor_render(xcursor_t *data) { /* TODO: why do i need effects ? */ gs_effect_t effect = gs_get_effect(); gs_eparam_t image = gs_effect_get_param_by_name(effect, "image"); gs_effect_set_texture(image, data->tex); gs_matrix_push(); gs_matrix_translate3f(-data->pos_x, -data->pos_y, 0); gs_enable_blending(True); gs_blend_function(GS_BLEND_ONE, GS_BLEND_INVSRCALPHA); gs_draw_sprite(data->tex, 0, 0, 0); gs_matrix_pop(); }
void device_draw(gs_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); gs_effect_t effect = gs_get_effect(); if (!can_render(device)) goto fail; if (effect) gs_effect_update_params(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"); }
bool gs_effect_loop(gs_effect_t *effect, const char *name) { if (!effect) { return false; } if (!effect->looping) { gs_technique_t *tech; if (!!gs_get_effect()) { blog(LOG_WARNING, "gs_effect_loop: An effect is " "already active"); return false; } tech = gs_effect_get_technique(effect, name); if (!tech) { blog(LOG_WARNING, "gs_effect_loop: Technique '%s' " "not found.", name); return false; } gs_technique_begin(tech); effect->looping = true; } else { gs_technique_end_pass(effect->cur_technique); } if (!gs_technique_begin_pass(effect->cur_technique, effect->loop_pass++)) { gs_technique_end(effect->cur_technique); effect->looping = false; effect->loop_pass = 0; return false; } return true; }