mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-15 07:48:04 +02:00
radeon/winsys: keep screen pointer in winsys v2
Only create one screen for each winsys instance. This helps with buffer sharing and interop handling. v2: rebased and some minor cleanup Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
f6e2aa0e12
commit
4871128e58
8 changed files with 48 additions and 22 deletions
|
|
@ -540,6 +540,9 @@ static void r300_destroy_screen(struct pipe_screen* pscreen)
|
|||
struct r300_screen* r300screen = r300_screen(pscreen);
|
||||
struct radeon_winsys *rws = radeon_winsys(pscreen);
|
||||
|
||||
if (rws && !radeon_winsys_unref(rws))
|
||||
return;
|
||||
|
||||
pipe_mutex_destroy(r300screen->cmask_mutex);
|
||||
|
||||
if (rws)
|
||||
|
|
|
|||
|
|
@ -958,6 +958,9 @@ static void r600_destroy_screen(struct pipe_screen* pscreen)
|
|||
if (rscreen == NULL)
|
||||
return;
|
||||
|
||||
if (!radeon_winsys_unref(rscreen->b.ws))
|
||||
return;
|
||||
|
||||
pipe_mutex_destroy(rscreen->aux_context_lock);
|
||||
rscreen->aux_context->destroy(rscreen->aux_context);
|
||||
|
||||
|
|
|
|||
|
|
@ -648,6 +648,9 @@ static void r600_destroy_screen(struct pipe_screen* pscreen)
|
|||
if (rscreen == NULL)
|
||||
return;
|
||||
|
||||
if (!radeon_winsys_unref(rscreen->b.ws))
|
||||
return;
|
||||
|
||||
if (rscreen->fences.bo) {
|
||||
struct r600_fence_block *entry, *tmp;
|
||||
|
||||
|
|
|
|||
|
|
@ -28,25 +28,27 @@
|
|||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
#include "radeon/drm/radeon_winsys.h"
|
||||
#include "r300/r300_public.h"
|
||||
|
||||
static struct pipe_screen *
|
||||
create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *sws;
|
||||
struct pipe_screen *screen;
|
||||
|
||||
sws = radeon_drm_winsys_create(fd);
|
||||
if (!sws)
|
||||
return NULL;
|
||||
|
||||
screen = r300_screen_create(sws);
|
||||
if (!screen)
|
||||
return NULL;
|
||||
if (!sws->screen) {
|
||||
sws->screen = r300_screen_create(sws);
|
||||
if (!sws->screen)
|
||||
return NULL;
|
||||
|
||||
screen = debug_screen_wrap(screen);
|
||||
sws->screen = debug_screen_wrap(sws->screen);
|
||||
}
|
||||
|
||||
return screen;
|
||||
return sws->screen;
|
||||
}
|
||||
|
||||
DRM_DRIVER_DESCRIPTOR("r300", "radeon", create_screen, NULL)
|
||||
|
|
|
|||
|
|
@ -28,24 +28,26 @@
|
|||
#include "state_tracker/drm_driver.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
#include "radeon/drm/radeon_winsys.h"
|
||||
#include "r600/r600_public.h"
|
||||
|
||||
static struct pipe_screen *create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *radeon;
|
||||
struct pipe_screen *screen;
|
||||
|
||||
radeon = radeon_drm_winsys_create(fd);
|
||||
if (!radeon)
|
||||
return NULL;
|
||||
|
||||
screen = r600_screen_create(radeon);
|
||||
if (!screen)
|
||||
return NULL;
|
||||
if (!radeon->screen) {
|
||||
radeon->screen = r600_screen_create(radeon);
|
||||
if (!radeon->screen)
|
||||
return NULL;
|
||||
|
||||
screen = debug_screen_wrap(screen);
|
||||
radeon->screen = debug_screen_wrap(radeon->screen);
|
||||
}
|
||||
|
||||
return screen;
|
||||
return radeon->screen;
|
||||
}
|
||||
|
||||
static const struct drm_conf_ret throttle_ret = {
|
||||
|
|
|
|||
|
|
@ -28,24 +28,26 @@
|
|||
#include "state_tracker/drm_driver.h"
|
||||
#include "target-helpers/inline_debug_helper.h"
|
||||
#include "radeon/drm/radeon_drm_public.h"
|
||||
#include "radeon/drm/radeon_winsys.h"
|
||||
#include "radeonsi/radeonsi_public.h"
|
||||
|
||||
static struct pipe_screen *create_screen(int fd)
|
||||
{
|
||||
struct radeon_winsys *radeon;
|
||||
struct pipe_screen *screen;
|
||||
|
||||
radeon = radeon_drm_winsys_create(fd);
|
||||
if (!radeon)
|
||||
return NULL;
|
||||
|
||||
screen = radeonsi_screen_create(radeon);
|
||||
if (!screen)
|
||||
return NULL;
|
||||
if (!radeon->screen) {
|
||||
radeon->screen = radeonsi_screen_create(radeon);
|
||||
if (!radeon->screen)
|
||||
return NULL;
|
||||
|
||||
screen = debug_screen_wrap(screen);
|
||||
radeon->screen = debug_screen_wrap(radeon->screen);
|
||||
}
|
||||
|
||||
return screen;
|
||||
return radeon->screen;
|
||||
}
|
||||
|
||||
static const struct drm_conf_ret throttle_ret = {
|
||||
|
|
|
|||
|
|
@ -424,10 +424,6 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
|
|||
{
|
||||
struct radeon_drm_winsys *ws = (struct radeon_drm_winsys*)rws;
|
||||
|
||||
if (!pipe_reference(&ws->base.reference, NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (ws->thread) {
|
||||
ws->kill_thread = 1;
|
||||
pipe_semaphore_signal(&ws->cs_queued);
|
||||
|
|
|
|||
|
|
@ -207,6 +207,11 @@ struct radeon_winsys {
|
|||
*/
|
||||
struct pipe_reference reference;
|
||||
|
||||
/**
|
||||
* The screen object this winsys was created for
|
||||
*/
|
||||
struct pipe_screen *screen;
|
||||
|
||||
/**
|
||||
* Destroy this winsys.
|
||||
*
|
||||
|
|
@ -501,6 +506,16 @@ struct radeon_winsys {
|
|||
enum radeon_value_id value);
|
||||
};
|
||||
|
||||
/**
|
||||
* Decrement the winsys reference count.
|
||||
*
|
||||
* \param ws The winsys this function is called for.
|
||||
*/
|
||||
static INLINE boolean radeon_winsys_unref(struct radeon_winsys *ws)
|
||||
{
|
||||
return pipe_reference(&ws->reference, NULL);
|
||||
}
|
||||
|
||||
static INLINE void radeon_emit(struct radeon_winsys_cs *cs, uint32_t value)
|
||||
{
|
||||
cs->buf[cs->cdw++] = value;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue