[Beignet] [PATCH 2/2] SKL: fix some failed piglit tests, caused by read constant error.
Yang Rong
rong.r.yang at intel.com
Fri Feb 6 00:19:00 PST 2015
SKL can use SIMD4X2 when msg type is LD, should use SIMD8. Add the Gen9Encoder for it.
Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
backend/src/CMakeLists.txt | 2 ++
backend/src/backend/gen9_context.hpp | 10 +++---
backend/src/backend/gen9_encoder.cpp | 68 ++++++++++++++++++++++++++++++++++++
backend/src/backend/gen9_encoder.hpp | 53 ++++++++++++++++++++++++++++
backend/src/backend/gen_encoder.cpp | 39 ++++++++++-----------
backend/src/backend/gen_encoder.hpp | 11 +++++-
6 files changed, 157 insertions(+), 26 deletions(-)
create mode 100644 backend/src/backend/gen9_encoder.cpp
create mode 100644 backend/src/backend/gen9_encoder.hpp
diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt
index 861bbdd..e84833a 100644
--- a/backend/src/CMakeLists.txt
+++ b/backend/src/CMakeLists.txt
@@ -123,6 +123,8 @@ set (GBE_SRC
backend/gen75_encoder.cpp
backend/gen8_encoder.hpp
backend/gen8_encoder.cpp
+ backend/gen9_encoder.hpp
+ backend/gen9_encoder.cpp
)
set (GBE_LINK_LIBRARIES
diff --git a/backend/src/backend/gen9_context.hpp b/backend/src/backend/gen9_context.hpp
index 76d36fc..4123414 100644
--- a/backend/src/backend/gen9_context.hpp
+++ b/backend/src/backend/gen9_context.hpp
@@ -23,7 +23,7 @@
#define __GBE_gen9_CONTEXT_HPP__
#include "backend/gen8_context.hpp"
-#include "backend/gen8_encoder.hpp"
+#include "backend/gen9_encoder.hpp"
namespace gbe
{
@@ -37,10 +37,10 @@ namespace gbe
: Gen8Context(unit, name, deviceID, relaxMath) {
};
- protected:
- virtual GenEncoder* generateEncoder(void) {
- return GBE_NEW(Gen8Encoder, this->simdWidth, 9, deviceID);
- }
+ protected:
+ virtual GenEncoder* generateEncoder(void) {
+ return GBE_NEW(Gen9Encoder, this->simdWidth, 9, deviceID);
+ }
private:
virtual void newSelection(void);
diff --git a/backend/src/backend/gen9_encoder.cpp b/backend/src/backend/gen9_encoder.cpp
new file mode 100644
index 0000000..80df50d
--- /dev/null
+++ b/backend/src/backend/gen9_encoder.cpp
@@ -0,0 +1,68 @@
+/*
+ Copyright (C) Intel Corp. 2006. All Rights Reserved.
+ Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
+ develop this 3D driver.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice (including the
+ next paragraph) shall be included in all copies or substantial
+ portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ **********************************************************************/
+
+#include "backend/gen9_encoder.hpp"
+
+namespace gbe
+{
+ void Gen9Encoder::SAMPLE(GenRegister dest,
+ GenRegister msg,
+ unsigned int msg_len,
+ bool header_present,
+ unsigned char bti,
+ unsigned char sampler,
+ uint32_t simdWidth,
+ uint32_t writemask,
+ uint32_t return_format,
+ bool isLD,
+ bool isUniform)
+ {
+ if (writemask == 0) return;
+ uint32_t msg_type = isLD ? GEN_SAMPLER_MESSAGE_SIMD8_LD :
+ GEN_SAMPLER_MESSAGE_SIMD8_SAMPLE;
+ uint32_t response_length = (4 * (simdWidth / 8));
+ uint32_t msg_length = (msg_len * (simdWidth / 8));
+ if (header_present)
+ msg_length++;
+ uint32_t simd_mode = (simdWidth == 16) ?
+ GEN_SAMPLER_SIMD_MODE_SIMD16 : GEN_SAMPLER_SIMD_MODE_SIMD8;
+ if(isUniform) {
+ response_length = 1;
+ msg_type = GEN_SAMPLER_MESSAGE_SIMD4X2_LD;
+ msg_length = 1;
+ simd_mode = GEN_SAMPLER_SIMD_MODE_SIMD8;
+ }
+ GenNativeInstruction *insn = this->next(GEN_OPCODE_SEND);
+ this->setHeader(insn);
+ this->setDst(insn, dest);
+ this->setSrc0(insn, msg);
+ setSamplerMessage(insn, bti, sampler, msg_type,
+ response_length, msg_length,
+ header_present,
+ simd_mode, return_format);
+ }
+} /* End of the name space. */
diff --git a/backend/src/backend/gen9_encoder.hpp b/backend/src/backend/gen9_encoder.hpp
new file mode 100644
index 0000000..319e871
--- /dev/null
+++ b/backend/src/backend/gen9_encoder.hpp
@@ -0,0 +1,53 @@
+/*
+ * Copyright © 2012 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * \file gen9_context.hpp
+ */
+#ifndef __GBE_GEN9_ENCODER_HPP__
+#define __GBE_GEN9_ENCODER_HPP__
+
+#include "backend/gen8_encoder.hpp"
+
+namespace gbe
+{
+ /* This class is used to implement the SKL
+ specific logic for encoder. */
+ class Gen9Encoder : public Gen8Encoder
+ {
+ public:
+ virtual ~Gen9Encoder(void) { }
+
+ Gen9Encoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID)
+ : Gen8Encoder(simdWidth, gen, deviceID) { }
+ /*! Send instruction for the sampler */
+ virtual void SAMPLE(GenRegister dest,
+ GenRegister msg,
+ unsigned int msg_len,
+ bool header_present,
+ unsigned char bti,
+ unsigned char sampler,
+ unsigned int simdWidth,
+ uint32_t writemask,
+ uint32_t return_format,
+ bool isLD,
+ bool isUniform);
+
+ };
+}
+#endif /* __GBE_GEN9_ENCODER_HPP__ */
diff --git a/backend/src/backend/gen_encoder.cpp b/backend/src/backend/gen_encoder.cpp
index 4d45811..5bf7df6 100644
--- a/backend/src/backend/gen_encoder.cpp
+++ b/backend/src/backend/gen_encoder.cpp
@@ -275,25 +275,6 @@ namespace gbe
}
#endif
- static void setSamplerMessage(GenEncoder *p,
- GenNativeInstruction *insn,
- unsigned char bti,
- unsigned char sampler,
- uint32_t msg_type,
- uint32_t response_length,
- uint32_t msg_length,
- bool header_present,
- uint32_t simd_mode,
- uint32_t return_format)
- {
- const GenMessageTarget sfid = GEN_SFID_SAMPLER;
- p->setMessageDescriptor(insn, sfid, msg_length, response_length);
- insn->bits3.sampler_gen7.bti = bti;
- insn->bits3.sampler_gen7.sampler = sampler;
- insn->bits3.sampler_gen7.msg_type = msg_type;
- insn->bits3.sampler_gen7.simd_mode = simd_mode;
- }
-
static void setDWordScatterMessgae(GenEncoder *p,
GenNativeInstruction *insn,
uint32_t bti,
@@ -1095,6 +1076,24 @@ namespace gbe
this->setSrc0(insn, src);
}
+ void GenEncoder::setSamplerMessage(GenNativeInstruction *insn,
+ unsigned char bti,
+ unsigned char sampler,
+ uint32_t msg_type,
+ uint32_t response_length,
+ uint32_t msg_length,
+ bool header_present,
+ uint32_t simd_mode,
+ uint32_t return_format)
+ {
+ const GenMessageTarget sfid = GEN_SFID_SAMPLER;
+ setMessageDescriptor(insn, sfid, msg_length, response_length);
+ insn->bits3.sampler_gen7.bti = bti;
+ insn->bits3.sampler_gen7.sampler = sampler;
+ insn->bits3.sampler_gen7.msg_type = msg_type;
+ insn->bits3.sampler_gen7.simd_mode = simd_mode;
+ }
+
void GenEncoder::SAMPLE(GenRegister dest,
GenRegister msg,
unsigned int msg_len,
@@ -1126,7 +1125,7 @@ namespace gbe
this->setHeader(insn);
this->setDst(insn, dest);
this->setSrc0(insn, msg);
- setSamplerMessage(this, insn, bti, sampler, msg_type,
+ setSamplerMessage(insn, bti, sampler, msg_type,
response_length, msg_length,
header_present,
simd_mode, return_format);
diff --git a/backend/src/backend/gen_encoder.hpp b/backend/src/backend/gen_encoder.hpp
index 1a6f75c..21faabc 100644
--- a/backend/src/backend/gen_encoder.hpp
+++ b/backend/src/backend/gen_encoder.hpp
@@ -185,7 +185,7 @@ namespace gbe
/*! for scratch memory write */
void SCRATCH_WRITE(GenRegister msg, uint32_t offset, uint32_t size, uint32_t src_num, uint32_t channel_mode);
/*! Send instruction for the sampler */
- void SAMPLE(GenRegister dest,
+ virtual void SAMPLE(GenRegister dest,
GenRegister msg,
unsigned int msg_len,
bool header_present,
@@ -196,6 +196,15 @@ namespace gbe
uint32_t return_format,
bool isLD,
bool isUniform);
+ void setSamplerMessage(GenNativeInstruction *insn,
+ unsigned char bti,
+ unsigned char sampler,
+ uint32_t msg_type,
+ uint32_t response_length,
+ uint32_t msg_length,
+ bool header_present,
+ uint32_t simd_mode,
+ uint32_t return_format);
/*! TypedWrite instruction for texture */
virtual void TYPED_WRITE(GenRegister header,
--
1.8.3.2
More information about the Beignet
mailing list