[Mesa-dev] [PATCH 1/2] st/hgl: Move st_manager create/destroy into hgl state_tracker

Alexander von Gluck IV kallisti5 at unixzen.com
Fri Aug 29 08:07:43 PDT 2014


---
 src/gallium/state_trackers/hgl/hgl.c               |   50 +++++++++++++++++++-
 src/gallium/state_trackers/hgl/hgl_context.h       |    5 ++
 .../targets/haiku-softpipe/GalliumContext.cpp      |   32 ++-----------
 3 files changed, 58 insertions(+), 29 deletions(-)

diff --git a/src/gallium/state_trackers/hgl/hgl.c b/src/gallium/state_trackers/hgl/hgl.c
index 8dcd6e3..66abc61 100644
--- a/src/gallium/state_trackers/hgl/hgl.c
+++ b/src/gallium/state_trackers/hgl/hgl.c
@@ -131,6 +131,23 @@ hgl_st_framebuffer_validate(struct st_context_iface *stctx,
 }
 
 
+static int
+hgl_st_manager_get_param(struct st_manager *smapi, enum st_manager_param param)
+{
+    CALLED();
+
+	switch (param) {
+		case ST_MANAGER_BROKEN_INVALIDATE:
+			TRACE("%s: TODO: How should we handle BROKEN_INVALIDATE calls?\n",
+				__func__);
+			// For now we force validation of the framebuffer.
+			return 1;
+	}
+
+	return 0;
+}
+
+
 /**
  * Create new framebuffer
  */
@@ -148,7 +165,7 @@ hgl_create_st_framebuffer(struct hgl_context* context)
 		// Copy context visual into framebuffer
 		memcpy(&buffer->visual, context->stVisual, sizeof(struct st_visual));
 
-		// calloc our st_framebuffer interface
+		// calloc and configure our st_framebuffer interface
 		buffer->stfbi = CALLOC_STRUCT(st_framebuffer_iface);
 		if (!buffer->stfbi) {
 			ERROR("%s: Couldn't calloc framebuffer!\n", __func__);
@@ -167,3 +184,34 @@ hgl_create_st_framebuffer(struct hgl_context* context)
 
    return buffer;
 }
+
+
+struct st_manager *
+hgl_create_st_manager(struct pipe_screen* screen)
+{
+	CALLED();
+
+	assert(screen);
+	struct st_manager* manager = CALLOC_STRUCT(st_manager);
+
+	if (!manager) {
+		ERROR("%s: Couldn't allocate state tracker manager!\n", __func__);
+		return NULL;
+	}
+
+	//manager->display = dpy;
+	manager->screen = screen;
+	manager->get_param = hgl_st_manager_get_param;
+
+	return manager;
+}
+
+
+void
+hgl_destroy_st_manager(struct st_manager *manager)
+{
+	CALLED();
+
+	if (manager)
+		FREE(manager);
+}
diff --git a/src/gallium/state_trackers/hgl/hgl_context.h b/src/gallium/state_trackers/hgl/hgl_context.h
index f1f43fa..a520d49 100644
--- a/src/gallium/state_trackers/hgl/hgl_context.h
+++ b/src/gallium/state_trackers/hgl/hgl_context.h
@@ -73,7 +73,12 @@ struct hgl_context
 };
 
 
+// hgl state_tracker framebuffer
 struct hgl_buffer* hgl_create_st_framebuffer(struct hgl_context* context);
 
+// hgl state_tracker manager
+struct st_manager* hgl_create_st_manager(struct pipe_screen* screen);
+void hgl_destroy_st_manager(struct st_manager *manager);
+
 
 #endif /* HGL_CONTEXT_H */
diff --git a/src/gallium/targets/haiku-softpipe/GalliumContext.cpp b/src/gallium/targets/haiku-softpipe/GalliumContext.cpp
index d7d5d9d..ed41712 100644
--- a/src/gallium/targets/haiku-softpipe/GalliumContext.cpp
+++ b/src/gallium/targets/haiku-softpipe/GalliumContext.cpp
@@ -69,23 +69,6 @@ hgl_viewport(struct gl_context* glContext)
 }
 
 
-static int
-hook_stm_get_param(struct st_manager *smapi, enum st_manager_param param)
-{
-	CALLED();
-
-	switch (param) {
-		case ST_MANAGER_BROKEN_INVALIDATE:
-			TRACE("%s: TODO: How should we handle BROKEN_INVALIDATE calls?\n",
-				__func__);
-			// For now we force validation of the framebuffer.
-			return 1;
-	}
-
-	return 0;
-}
-
-
 GalliumContext::GalliumContext(ulong options)
 	:
 	fOptions(options),
@@ -264,12 +247,8 @@ GalliumContext::CreateContext(Bitmap *bitmap)
 		return -1;
 	}
 
-	context->manager = CALLOC_STRUCT(st_manager);
-	if (!context->manager) {
-		ERROR("%s: Couldn't allocate Mesa state tracker manager!\n", __func__);
-		return -1;
-	}
-	context->manager->get_param = hook_stm_get_param;
+	// Create state_tracker manager
+	context->manager = hgl_create_st_manager(fScreen);
 
 	// Create state tracker visual
 	context->stVisual = CreateVisual();
@@ -287,9 +266,6 @@ GalliumContext::CreateContext(Bitmap *bitmap)
 		return -1;
 	}
 
-	// We need to assign the screen *before* calling st_api create_context
-	context->manager->screen = fScreen;
-
 	// Build state tracker attributes
 	struct st_context_attribs attribs;
 	memset(&attribs, 0, sizeof(attribs));
@@ -405,7 +381,7 @@ GalliumContext::DestroyContext(context_id contextID)
 		FREE(fContext[contextID]->stVisual);
 
 	if (fContext[contextID]->manager)
-		FREE(fContext[contextID]->manager);
+		hgl_destroy_st_manager(fContext[contextID]->manager);
 
 	FREE(fContext[contextID]);
 }
@@ -523,7 +499,7 @@ GalliumContext::ResizeViewport(int32 width, int32 height)
 		if (fContext[i] && fContext[i]->st) {
 			struct st_context *stContext = (struct st_context*)fContext[i]->st;
 			_mesa_set_viewport(stContext->ctx, 0, 0, 0, width, height);
-        		st_manager_validate_framebuffers(stContext);
+			st_manager_validate_framebuffers(stContext);
 		}
 	}
 }
-- 
1.7.1



More information about the mesa-dev mailing list