this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Added GPU_ResetRendererState(), which reapplies SDL_gpu's backend state so you can more easily use direct backend API (e.g. OpenGL) calls.

+90 -14
+76 -14
SDL_gpu/GL_common/SDL_gpu_GL_common.inl
··· 535 535 cdata->last_use_blending = enable; 536 536 } 537 537 538 - static void changeBlendMode(GPU_Renderer* renderer, GPU_BlendMode mode) 538 + static void forceChangeBlendMode(GPU_Renderer* renderer, GPU_BlendMode mode) 539 539 { 540 540 GPU_CONTEXT_DATA* cdata = (GPU_CONTEXT_DATA*)renderer->current_context_target->context->data; 541 - if(cdata->last_blend_mode.source_color == mode.source_color 542 - && cdata->last_blend_mode.dest_color == mode.dest_color 543 - && cdata->last_blend_mode.source_alpha == mode.source_alpha 544 - && cdata->last_blend_mode.dest_alpha == mode.dest_alpha 545 - && cdata->last_blend_mode.color_equation == mode.color_equation 546 - && cdata->last_blend_mode.alpha_equation == mode.alpha_equation) 547 - return; 548 541 549 542 renderer->impl->FlushBlitBuffer(renderer); 550 543 ··· 578 571 { 579 572 GPU_PushErrorCode("(SDL_gpu internal)", GPU_ERROR_BACKEND_ERROR, "Could not set blend equation because GPU_FEATURE_BLEND_EQUATIONS is not supported."); 580 573 } 574 + } 575 + 576 + static void changeBlendMode(GPU_Renderer* renderer, GPU_BlendMode mode) 577 + { 578 + GPU_CONTEXT_DATA* cdata = (GPU_CONTEXT_DATA*)renderer->current_context_target->context->data; 579 + if(cdata->last_blend_mode.source_color == mode.source_color 580 + && cdata->last_blend_mode.dest_color == mode.dest_color 581 + && cdata->last_blend_mode.source_alpha == mode.source_alpha 582 + && cdata->last_blend_mode.dest_alpha == mode.dest_alpha 583 + && cdata->last_blend_mode.color_equation == mode.color_equation 584 + && cdata->last_blend_mode.alpha_equation == mode.alpha_equation) 585 + return; 586 + 587 + forceChangeBlendMode(renderer, mode); 581 588 } 582 589 583 590 ··· 700 707 701 708 702 709 703 - static void changeViewport(GPU_Target* target) 710 + static void forceChangeViewport(GPU_Target* target, GPU_Rect viewport) 704 711 { 712 + float y; 705 713 GPU_CONTEXT_DATA* cdata = (GPU_CONTEXT_DATA*)(GPU_GetContextTarget()->context->data); 706 - GPU_Rect viewport = target->viewport; 707 - float y; 708 - 709 - if(cdata->last_viewport.x == viewport.x && cdata->last_viewport.y == viewport.y && cdata->last_viewport.w == viewport.w && cdata->last_viewport.h == viewport.h) 710 - return; 714 + 711 715 cdata->last_viewport = viewport; 712 716 713 717 // Need the real height to flip the y-coord (from OpenGL coord system) ··· 718 722 y = target->context->window_h - viewport.h - viewport.y; 719 723 720 724 glViewport(viewport.x, y, viewport.w, viewport.h); 725 + } 726 + 727 + static void changeViewport(GPU_Target* target) 728 + { 729 + GPU_CONTEXT_DATA* cdata = (GPU_CONTEXT_DATA*)(GPU_GetContextTarget()->context->data); 730 + 731 + if(cdata->last_viewport.x == target->viewport.x && cdata->last_viewport.y == target->viewport.y && cdata->last_viewport.w == target->viewport.w && cdata->last_viewport.h == target->viewport.h) 732 + return; 733 + 734 + forceChangeViewport(target, target->viewport); 721 735 } 722 736 723 737 static void applyTargetCamera(GPU_Target* target) ··· 1380 1394 return; 1381 1395 1382 1396 renderer->impl->MakeCurrent(renderer, renderer->current_context_target, renderer->current_context_target->context->windowID); 1397 + } 1398 + 1399 + static void ResetRendererState(GPU_Renderer* renderer) 1400 + { 1401 + GPU_Target* target; 1402 + GPU_CONTEXT_DATA* cdata; 1403 + 1404 + if(renderer->current_context_target == NULL) 1405 + return; 1406 + 1407 + target = renderer->current_context_target; 1408 + cdata = (GPU_CONTEXT_DATA*)target->context->data; 1409 + 1410 + 1411 + #ifndef SDL_GPU_DISABLE_SHADERS 1412 + if(renderer->impl->IsFeatureEnabled(renderer, GPU_FEATURE_BASIC_SHADERS)) 1413 + glUseProgram(target->context->current_shader_program); 1414 + #endif 1415 + SDL_GL_MakeCurrent(SDL_GetWindowFromID(target->context->windowID), target->context->context); 1416 + 1417 + 1418 + #ifndef SDL_GPU_USE_BUFFER_PIPELINE 1419 + glColor4f(cdata->last_color.r/255.01f, cdata->last_color.g/255.01f, cdata->last_color.b/255.01f, GET_ALPHA(cdata->last_color)/255.01f); 1420 + #endif 1421 + #ifndef SDL_GPU_SKIP_ENABLE_TEXTURE_2D 1422 + if(cdata->last_use_texturing) 1423 + glEnable(GL_TEXTURE_2D); 1424 + else 1425 + glDisable(GL_TEXTURE_2D); 1426 + #endif 1427 + 1428 + if(cdata->last_use_blending) 1429 + glEnable(GL_BLEND); 1430 + else 1431 + glDisable(GL_BLEND); 1432 + 1433 + forceChangeBlendMode(renderer, cdata->last_blend_mode); 1434 + 1435 + forceChangeViewport(target, target->viewport); 1436 + 1437 + if(cdata->last_image != NULL) 1438 + glBindTexture(GL_TEXTURE_2D, ((GPU_IMAGE_DATA*)(cdata->last_image)->data)->handle); 1439 + 1440 + if(cdata->last_target != NULL) 1441 + extBindFramebuffer(renderer, ((GPU_TARGET_DATA*)cdata->last_target->data)->handle); 1442 + else 1443 + extBindFramebuffer(renderer, ((GPU_TARGET_DATA*)target->data)->handle); 1383 1444 } 1384 1445 1385 1446 static Uint8 SetWindowResolution(GPU_Renderer* renderer, Uint16 w, Uint16 h) ··· 5789 5850 impl->CreateAliasTarget = &CreateAliasTarget; \ 5790 5851 impl->MakeCurrent = &MakeCurrent; \ 5791 5852 impl->SetAsCurrent = &SetAsCurrent; \ 5853 + impl->ResetRendererState = &ResetRendererState; \ 5792 5854 impl->SetWindowResolution = &SetWindowResolution; \ 5793 5855 impl->SetVirtualResolution = &SetVirtualResolution; \ 5794 5856 impl->UnsetVirtualResolution = &UnsetVirtualResolution; \
+8
SDL_gpu/SDL_gpu.c
··· 61 61 current_renderer->impl->SetAsCurrent(current_renderer); 62 62 } 63 63 64 + void GPU_ResetRendererState(void) 65 + { 66 + if(current_renderer == NULL || current_renderer->current_context_target == NULL) 67 + return; 68 + 69 + current_renderer->impl->ResetRendererState(current_renderer); 70 + } 71 + 64 72 GPU_Renderer* GPU_GetCurrentRenderer(void) 65 73 { 66 74 return current_renderer;
+3
SDL_gpu/SDL_gpu.h
··· 660 660 /*! Switches the current renderer to the renderer matching the given identifier. */ 661 661 void GPU_SetCurrentRenderer(GPU_RendererID id); 662 662 663 + /*! Reapplies the renderer state to the backend API (e.g. OpenGL, Direct3D). Use this if you want SDL_gpu to be able to render after you've used direct backend calls. */ 664 + void GPU_ResetRendererState(void); 665 + 663 666 664 667 665 668
+3
SDL_gpu/SDL_gpu_RendererImpl.h
··· 28 28 /*! Sets up this renderer to act as the current renderer. Called automatically by GPU_SetCurrentRenderer(). */ 29 29 void (*SetAsCurrent)(GPU_Renderer* renderer); 30 30 31 + /*! \see GPU_ResetRendererState() */ 32 + void (*ResetRendererState)(GPU_Renderer* renderer); 33 + 31 34 /*! \see GPU_SetWindowResolution() */ 32 35 Uint8 (*SetWindowResolution)(GPU_Renderer* renderer, Uint16 w, Uint16 h); 33 36