this repo has no description
0
fork

Configure Feed

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

Added refcount to GPU_Context so alias targets can keep the context alive. Cleaned up FreeTarget() so that it delegates in order to avoid edge cases.

+82 -74
+2
include/SDL_gpu.h
··· 380 380 int matrix_mode; 381 381 GPU_MatrixStack projection_matrix; 382 382 GPU_MatrixStack modelview_matrix; 383 + 384 + int refcount; 383 385 384 386 void* data; 385 387 } GPU_Context;
+77 -74
src/renderer_GL_common.inl
··· 1324 1324 memset(target->context, 0, sizeof(GPU_Context)); 1325 1325 cdata = (GPU_CONTEXT_DATA*)SDL_malloc(sizeof(GPU_CONTEXT_DATA)); 1326 1326 memset(cdata, 0, sizeof(GPU_CONTEXT_DATA)); 1327 + 1328 + target->context->refcount = 1; 1327 1329 target->context->data = cdata; 1328 1330 target->context->context = NULL; 1329 1331 ··· 1682 1684 // Alias info 1683 1685 if(target->image != NULL) 1684 1686 target->image->refcount++; 1687 + if(target->context != NULL) 1688 + target->context->refcount++; 1685 1689 ((GPU_TARGET_DATA*)target->data)->refcount++; 1686 1690 result->refcount = 1; 1687 1691 result->is_alias = GPU_TRUE; ··· 3700 3704 3701 3705 3702 3706 3703 - static void FreeTarget(GPU_Renderer* renderer, GPU_Target* target) 3707 + static void FreeTargetData(GPU_Renderer* renderer, GPU_TARGET_DATA* data) 3704 3708 { 3705 - GPU_TARGET_DATA* data; 3706 - 3707 - if(target == NULL) 3708 - return; 3709 - 3710 - if(target->refcount > 1) 3711 - { 3712 - target->refcount--; 3713 - return; 3714 - } 3715 - 3716 - if(!target->is_alias && target->context != NULL && target->context->failed) 3717 - { 3718 - GPU_CONTEXT_DATA* cdata = (GPU_CONTEXT_DATA*)target->context->data; 3719 - 3720 - if(target == renderer->current_context_target) 3721 - renderer->current_context_target = NULL; 3722 - 3723 - SDL_free(cdata->blit_buffer); 3724 - SDL_free(cdata->index_buffer); 3725 - 3726 - #ifdef SDL_GPU_USE_SDL2 3727 - if(target->context->context != 0) 3728 - SDL_GL_DeleteContext(target->context->context); 3729 - #endif 3730 - 3731 - // Remove all of the window mappings that refer to this target 3732 - GPU_RemoveWindowMappingByTarget(target); 3733 - 3734 - SDL_free(target->context->data); 3735 - SDL_free(target->context); 3736 - 3737 - // Does the renderer data need to be freed too? 3738 - data = ((GPU_TARGET_DATA*)target->data); 3739 - 3740 - SDL_free(data); 3741 - SDL_free(target); 3742 - 3709 + if(data == NULL) 3743 3710 return; 3744 - } 3745 3711 3746 - if(target == renderer->current_context_target) 3747 - { 3748 - renderer->impl->FlushBlitBuffer(renderer); 3749 - renderer->current_context_target = NULL; 3750 - } 3751 - else if(target->context_target != NULL) 3752 - GPU_MakeCurrent(target->context_target, target->context_target->context->windowID); 3753 - 3754 - if(target->image != NULL && target->image->target == target) 3755 - target->image->target = NULL; // Remove reference to this object 3756 - 3757 - 3758 - // Does the renderer data need to be freed too? 3759 - data = ((GPU_TARGET_DATA*)target->data); 3760 3712 if(data->refcount > 1) 3761 3713 { 3762 3714 data->refcount--; 3763 - SDL_free(target); 3764 3715 return; 3765 3716 } 3766 - 3717 + 3718 + // Time to actually free this target data 3767 3719 if(renderer->enabled_features & GPU_FEATURE_RENDER_TARGETS) 3768 3720 { 3769 3721 int default_framebuffer_handle = 0; 3770 - if(renderer->current_context_target != NULL) 3771 - flushAndClearBlitBufferIfCurrentFramebuffer(renderer, target); 3772 3722 3773 3723 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &default_framebuffer_handle); 3774 3724 if(data->handle != default_framebuffer_handle) 3775 3725 glDeleteFramebuffers(1, &data->handle); 3776 3726 } 3727 + 3728 + SDL_free(data); 3729 + } 3777 3730 3778 - if(target->context != NULL) 3731 + static void FreeContext(GPU_Context* context) 3732 + { 3733 + GPU_CONTEXT_DATA* cdata; 3734 + 3735 + if(context == NULL) 3736 + return; 3737 + 3738 + if(context->refcount > 1) 3779 3739 { 3780 - GPU_CONTEXT_DATA* cdata = (GPU_CONTEXT_DATA*)target->context->data; 3740 + context->refcount--; 3741 + return; 3742 + } 3743 + 3744 + // Time to actually free this context and its data 3745 + cdata = (GPU_CONTEXT_DATA*)context->data; 3781 3746 3782 - SDL_free(cdata->blit_buffer); 3783 - SDL_free(cdata->index_buffer); 3747 + SDL_free(cdata->blit_buffer); 3748 + SDL_free(cdata->index_buffer); 3784 3749 3750 + if(!context->failed) 3751 + { 3785 3752 #ifdef SDL_GPU_USE_BUFFER_PIPELINE 3786 3753 glDeleteBuffers(2, cdata->blit_VBO); 3787 3754 glDeleteBuffers(1, &cdata->blit_IBO); 3788 3755 glDeleteBuffers(16, cdata->attribute_VBO); 3789 - #if !defined(SDL_GPU_NO_VAO) 3790 - glDeleteVertexArrays(1, &cdata->blit_VAO); 3791 - #endif 3756 + #if !defined(SDL_GPU_NO_VAO) 3757 + glDeleteVertexArrays(1, &cdata->blit_VAO); 3758 + #endif 3792 3759 #endif 3760 + } 3793 3761 3794 - #ifdef SDL_GPU_USE_SDL2 3795 - if(target->context->context != 0) 3796 - SDL_GL_DeleteContext(target->context->context); 3797 - #endif 3762 + #ifdef SDL_GPU_USE_SDL2 3763 + if(context->context != 0) 3764 + SDL_GL_DeleteContext(context->context); 3765 + #endif 3766 + 3767 + SDL_free(cdata); 3768 + SDL_free(context); 3769 + } 3770 + 3771 + static void FreeTarget(GPU_Renderer* renderer, GPU_Target* target) 3772 + { 3773 + if(target == NULL) 3774 + return; 3775 + 3776 + if(target->refcount > 1) 3777 + { 3778 + target->refcount--; 3779 + return; 3780 + } 3781 + 3782 + // Time to actually free this target 3783 + 3784 + // Prepare to work in this target's context, if it has one 3785 + if(target == renderer->current_context_target) 3786 + renderer->impl->FlushBlitBuffer(renderer); 3787 + else if(target->context_target != NULL) 3788 + GPU_MakeCurrent(target->context_target, target->context_target->context->windowID); 3798 3789 3790 + 3791 + // Release renderer data reference 3792 + FreeTargetData(renderer, (GPU_TARGET_DATA*)target->data); 3793 + 3794 + // Release context reference 3795 + if(target->context != NULL) 3796 + { 3799 3797 // Remove all of the window mappings that refer to this target 3800 3798 GPU_RemoveWindowMappingByTarget(target); 3801 - 3802 - SDL_free(target->context->data); 3803 - SDL_free(target->context); 3804 - target->context = NULL; 3799 + 3800 + FreeContext(target->context); 3805 3801 } 3802 + 3803 + // Clear references to this target 3804 + if(target == renderer->current_context_target) 3805 + renderer->current_context_target = NULL; 3806 3806 3807 - SDL_free(data); 3807 + if(target->image != NULL && target->image->target == target) 3808 + target->image->target = NULL; 3809 + 3810 + 3808 3811 SDL_free(target); 3809 3812 } 3810 3813
+3
tests/renderer/main.c
··· 101 101 target->context = (GPU_Context*)malloc(sizeof(GPU_Context)); 102 102 memset(target->context, 0, sizeof(GPU_Context)); 103 103 104 + target->context->refcount = 1; 104 105 target->context->windowID = windowID; 105 106 target->context->data = NULL; // Allocate a data structure as needed for other context data 106 107 target->context->context = NULL; ··· 175 176 // Alias info 176 177 if(target->image != NULL) 177 178 target->image->refcount++; 179 + if(target->context != NULL) 180 + target->context->refcount++; 178 181 result->refcount = 1; 179 182 result->is_alias = 1; 180 183