소스 검색

DXBC: Added operand modifier annotation.

Branimir Karadžić 8 년 전
부모
커밋
9d167c7a38
3개의 변경된 파일37개의 추가작업 그리고 3개의 파일을 삭제
  1. 3 0
      src/shader.cpp
  2. 21 3
      src/shader_dxbc.cpp
  3. 13 0
      src/shader_dxbc.h

+ 3 - 0
src/shader.cpp

@@ -16,6 +16,7 @@ namespace bgfx
 		char temp[512];
 		toString(temp, sizeof(temp), _instruction);
 		bx::write(writer, temp, (int32_t)bx::strLen(temp) );
+		bx::write(writer, '\n');
 		return true;
 	}
 
@@ -25,6 +26,7 @@ namespace bgfx
 		char temp[512];
 		toString(temp, sizeof(temp), _instruction);
 		bx::write(writer, temp, (int32_t)bx::strLen(temp) );
+		bx::write(writer, '\n');
 		return true;
 	}
 
@@ -34,6 +36,7 @@ namespace bgfx
 		char temp[512];
 		toString(temp, sizeof(temp), _instruction);
 		bx::write(writer, temp, (int32_t)bx::strLen(temp) );
+		bx::write(writer, '\n');
 		return true;
 	}
 

+ 21 - 3
src/shader_dxbc.cpp

@@ -977,7 +977,7 @@ namespace bgfx
 
 		if (_operand.extended)
 		{
-			size += bx::write(_writer, _operand.extBits);
+			size += bx::write(_writer, _operand.extBits, _err);
 		}
 
 		switch (_operand.type)
@@ -1452,7 +1452,7 @@ namespace bgfx
 							, "%s%s%s"
 							, getName(_instruction.opcode)
 							, _instruction.saturate ? "_sat" : ""
-							, _instruction.testNZ ? "_nz" : ""
+							, _instruction.testNZ   ? "_nz"  : ""
 							);
 
 		if (DxbcResourceDim::Unknown != _instruction.srv)
@@ -1480,10 +1480,24 @@ namespace bgfx
 				|| DxbcOperandAddrMode::Imm32 != operand.addrMode[0]
 				;
 
+			const char* preOperand  = "";
+			const char* postOperand = "";
+
+			if (operand.extended)
+			{
+				switch(DxbcOperandModifier::Enum(operand.extBits & UINT32_C(0x00000003) ) )
+				{
+				case DxbcOperandModifier::Neg:    preOperand =     "-"; postOperand =  ""; break;
+				case DxbcOperandModifier::Abs:    preOperand =  "abs("; postOperand = ")"; break;
+				case DxbcOperandModifier::AbsNeg: preOperand = "-abs("; postOperand = ")"; break;
+				default: break;
+				}
+			}
+
 			size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)
 								, "%s%s%s"
 								, 0 == ii ? " " : ", "
-								, operand.extended ? "*" : ""
+								, preOperand
 								, s_dxbcOperandType[operand.type]
 								);
 
@@ -1604,6 +1618,10 @@ namespace bgfx
 				break;
 			}
 
+			size += bx::snprintf(&_out[size], bx::uint32_imax(0, _size-size)
+								, "%s"
+								, postOperand
+								);
 		}
 
 		return size;

+ 13 - 0
src/shader_dxbc.h

@@ -448,6 +448,19 @@ namespace bgfx
 		};
 	};
 
+	struct DxbcOperandModifier
+	{
+		enum Enum
+		{
+			None,
+			Neg,
+			Abs,
+			AbsNeg,
+
+			Count
+		};
+	};
+
 	struct DxbcSubOperand
 	{
 		DxbcSubOperand()