Jelajahi Sumber

Fixed the deadlock when starting the render thread

Marko Pintera 13 tahun lalu
induk
melakukan
bb8e189cf4

+ 4 - 7
CamelotClient/CamelotClient.cpp

@@ -161,18 +161,18 @@ int CALLBACK WinMain(
 																				\
 							 uniform mainFragBlock								\
 							 {													\
-							 float test1[2];									\
-							 InputStruct input[2];								\
+							 float test1;										\
 							 mat4 matViewProjection;							\
 							 float test2;										\
 							 };													\
+							 uniform InputStruct input[2];						\
 							 in vec4 cm_position; \
 							 in vec2 cm_texcoord0; \
 							 out vec2 texcoord0; \
 							 void main() \
 							 { \
-							 texcoord0 = cm_texcoord0 * test1[0]; \
-							 gl_Position = cm_position * (matViewProjection * test1[1]); \
+							 texcoord0 = cm_texcoord0 * input[1].uvMultiplier; \
+							 gl_Position = cm_position * (matViewProjection * input[1].matMultiplier[1]); \
 							 }";
 
 	HighLevelGpuProgramHandle vertProgRef= HighLevelGpuProgram::create(vertShaderCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
@@ -196,7 +196,6 @@ int CALLBACK WinMain(
 
 #if defined GL
 	testShader->addParameter("input", "input", GPDT_STRUCT, 2, 12);
-	testShader->addParameter("test1", "test1", GPDT_FLOAT1, 2);
 #endif
 
 	testShader->addParameter("samp", "samp", GPOT_SAMPLER2D);
@@ -252,8 +251,6 @@ int CALLBACK WinMain(
 
 	testMaterial->setStructData("input", dbgMultipliers1, sizeof(dbgMultipliers1), 0);
 	testMaterial->setStructData("input", dbgMultipliers2, sizeof(dbgMultipliers2), 1);
-	testMaterial->setFloat("test1", 1.0f, 0);
-	testMaterial->setFloat("test1", 1.0f, 1);
 #endif
 
 	//testMaterialRef = gResources().load("C:\\testMaterial.mat");

+ 1 - 1
CamelotGLRenderer/Source/GLSL/include/CmGLSLParamParser.h

@@ -517,7 +517,7 @@ namespace CamelotEngine
 			GLint arrayStride;
 			glGetActiveUniformsiv(programHandle, 1, &uniformIndex, GL_UNIFORM_ARRAY_STRIDE, &arrayStride);
 
-			if(arrayStride != 0)
+			if(arrayStride > 0)
 			{
 				assert (arrayStride % 4 == 0);
 

+ 1 - 0
CamelotRenderer/Include/CmRenderSystem.h

@@ -403,6 +403,7 @@ namespace CamelotEngine
 		};
 
 		RenderWorkerFunc* mRenderThreadFunc;
+		volatile bool mRenderThreadStarted;
 		volatile bool mRenderThreadShutdown;
 
 		CM_THREAD_ID_TYPE mRenderThreadId;

+ 13 - 2
CamelotRenderer/Source/CmRenderSystem.cpp

@@ -64,6 +64,7 @@ namespace CamelotEngine {
 		, mClipPlanesDirty(true)
 		, mCurrentCapabilities(nullptr)
 		, mRenderThreadFunc(nullptr)
+		, mRenderThreadStarted(false)
 		, mRenderThreadShutdown(false)
 		, mCommandQueue(nullptr)
 		, mMaxCommandNotifyId(0)
@@ -278,8 +279,10 @@ namespace CamelotEngine {
 		CM_THREAD_CREATE(t, *mRenderThreadFunc);
 		mRenderThread = t;
 
-		CM_LOCK_MUTEX_NAMED(mRenderThreadStartMutex, lock)
-		CM_THREAD_WAIT(mRenderThreadStartCondition, mRenderThreadStartMutex, lock)
+		CM_LOCK_MUTEX_NAMED(mRenderThreadStartMutex, lock);
+
+		while(!mRenderThreadStarted)
+			CM_THREAD_WAIT(mRenderThreadStartCondition, mRenderThreadStartMutex, lock);
 
 #else
 		CM_EXCEPT(InternalErrorException, "Attempting to start a render thread but Camelot isn't compiled with thread support.");
@@ -292,6 +295,12 @@ namespace CamelotEngine {
 #if !CM_FORCE_SINGLETHREADED_RENDERING
 		mRenderThreadId = CM_THREAD_CURRENT_ID;
 
+		{
+			CM_LOCK_MUTEX(mRenderThreadStartMutex);
+
+			mRenderThreadStarted = true;
+		}
+
 		CM_THREAD_NOTIFY_ALL(mRenderThreadStartCondition)
 
 		while(true)
@@ -336,6 +345,8 @@ namespace CamelotEngine {
 		mRenderThread = nullptr;
 		mRenderThreadId = CM_THREAD_CURRENT_ID;
 #endif
+
+		mRenderThreadStarted = false;
 	}
 
 	DeferredRenderContextPtr RenderSystem::createDeferredContext()

+ 0 - 3
CamelotRenderer/TODO.txt

@@ -23,9 +23,6 @@ Add a better way of determining GLSL cpuMemOffset and block size (seems to be us
  - I probably need to determine struct sizes before assigning cpuMemOffset
  - I probably also need a preprocessing step to determine array sizes
 
-
-Seems there is a possible deadlock when starting the render thread, while waiting for the thread to be started
-
 Deserialization issues:
  - Currently Reflectable is not allowed to hold a ReflectablePtr
    - Because Reflectable might be assigned before a pointer is decoded and assigned, therefore