diff --git a/src/dawn_native/d3d12/CommandBufferD3D12.cpp b/src/dawn_native/d3d12/CommandBufferD3D12.cpp
index 60a23d0..095b410 100644
--- a/src/dawn_native/d3d12/CommandBufferD3D12.cpp
+++ b/src/dawn_native/d3d12/CommandBufferD3D12.cpp
@@ -154,21 +154,24 @@
                           uint32_t dynamicOffsetCount,
                           uint64_t* dynamicOffsets,
                           bool force = false) {
-            if (mBindGroups[index] != group || force) {
-                mBindGroups[index] = group;
-                uint32_t currentDynamicBufferIndex = 0;
-
+            // Usually, the application won't set the same offsets many times,
+            // so always try to apply dynamic offsets even if the offsets stay the same
+            if (dynamicOffsetCount) {
+                // Update dynamic offsets
                 const BindGroupLayout::LayoutBindingInfo& layout =
                     group->GetLayout()->GetBindingInfo();
+                uint32_t currentDynamicBufferIndex = 0;
+
                 for (uint32_t bindingIndex : IterateBitSet(layout.dynamic)) {
                     ASSERT(dynamicOffsetCount > 0);
                     uint32_t parameterIndex =
                         pipelineLayout->GetDynamicRootParameterIndex(index, bindingIndex);
                     BufferBinding binding = group->GetBindingAsBufferBinding(bindingIndex);
 
-                    // Calculate buffer locations that root descriptors links to. The location is
-                    // (base buffer location + initial offset + dynamic offset)
-                    uint64_t offset = dynamicOffsets[currentDynamicBufferIndex++] + binding.offset;
+                    // Calculate buffer locations that root descriptors links to. The location
+                    // is (base buffer location + initial offset + dynamic offset)
+                    uint64_t dynamicOffset = dynamicOffsets[currentDynamicBufferIndex];
+                    uint64_t offset = binding.offset + dynamicOffset;
                     D3D12_GPU_VIRTUAL_ADDRESS bufferLocation =
                         ToBackend(binding.buffer)->GetVA() + offset;
 
@@ -198,7 +201,15 @@
                             UNREACHABLE();
                             break;
                     }
+
+                    // Record current dynamic offsets for inheriting
+                    mLastDynamicOffsets[index][currentDynamicBufferIndex] = dynamicOffset;
+                    ++currentDynamicBufferIndex;
                 }
+            }
+
+            if (mBindGroups[index] != group || force) {
+                mBindGroups[index] = group;
                 uint32_t cbvUavSrvCount =
                     ToBackend(group->GetLayout())->GetCbvUavSrvDescriptorCount();
                 uint32_t samplerCount = ToBackend(group->GetLayout())->GetSamplerDescriptorCount();
@@ -244,12 +255,11 @@
             for (uint32_t i = 0; i < inheritUntil; ++i) {
                 const BindGroupLayout* layout = ToBackend(mBindGroups[i]->GetLayout());
                 const uint32_t dynamicBufferCount = layout->GetDynamicBufferCount();
-                // TODO(shaobo.yan@intel.com) : Need to handle dynamic resources inherited with last
-                // dynamic offsets.
+
+                // Inherit dynamic offsets
                 if (dynamicBufferCount > 0) {
-                    std::vector<uint64_t> zeroOffsets(dynamicBufferCount, 0);
                     SetBindGroup(commandList, newLayout, mBindGroups[i], i, dynamicBufferCount,
-                                 zeroOffsets.data(), true);
+                                 mLastDynamicOffsets[i].data(), true);
                 } else {
                     SetBindGroup(commandList, newLayout, mBindGroups[i], i, 0, nullptr, true);
                 }
@@ -280,6 +290,8 @@
         uint32_t mSamplerDescriptorHeapSize = 0;
         std::array<BindGroup*, kMaxBindGroups> mBindGroups = {};
         std::deque<BindGroup*> mBindGroupsList = {};
+        std::array<std::array<uint64_t, kMaxDynamicBufferCount>, kMaxBindGroups>
+            mLastDynamicOffsets;
         bool mInCompute = false;
 
         DescriptorHeapHandle mCbvSrvUavGPUDescriptorHeap = {};
@@ -808,9 +820,11 @@
                     SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>();
                     BindGroup* group = ToBackend(cmd->group.Get());
                     uint64_t* dynamicOffsets = nullptr;
+
                     if (cmd->dynamicOffsetCount > 0) {
                         dynamicOffsets = mCommands.NextData<uint64_t>(cmd->dynamicOffsetCount);
                     }
+
                     bindingTracker->SetBindGroup(commandList, lastLayout, group, cmd->index,
                                                  cmd->dynamicOffsetCount, dynamicOffsets);
                 } break;
@@ -1118,6 +1132,7 @@
                     SetBindGroupCmd* cmd = mCommands.NextCommand<SetBindGroupCmd>();
                     BindGroup* group = ToBackend(cmd->group.Get());
                     uint64_t* dynamicOffsets = nullptr;
+
                     if (cmd->dynamicOffsetCount > 0) {
                         dynamicOffsets = mCommands.NextData<uint64_t>(cmd->dynamicOffsetCount);
                     }
diff --git a/src/dawn_native/d3d12/PipelineLayoutD3D12.cpp b/src/dawn_native/d3d12/PipelineLayoutD3D12.cpp
index f5ae7c7..6cbb308 100644
--- a/src/dawn_native/d3d12/PipelineLayoutD3D12.cpp
+++ b/src/dawn_native/d3d12/PipelineLayoutD3D12.cpp
@@ -165,7 +165,7 @@
         return mSamplerRootParameterInfo[group];
     }
 
-    ComPtr<ID3D12RootSignature> PipelineLayout::GetRootSignature() {
+    ComPtr<ID3D12RootSignature> PipelineLayout::GetRootSignature() const {
         return mRootSignature;
     }
 
diff --git a/src/dawn_native/d3d12/PipelineLayoutD3D12.h b/src/dawn_native/d3d12/PipelineLayoutD3D12.h
index 2b8358c..b2ee9e6 100644
--- a/src/dawn_native/d3d12/PipelineLayoutD3D12.h
+++ b/src/dawn_native/d3d12/PipelineLayoutD3D12.h
@@ -33,7 +33,7 @@
         // Returns the index of the root parameter reserved for a dynamic buffer binding
         uint32_t GetDynamicRootParameterIndex(uint32_t group, uint32_t binding) const;
 
-        ComPtr<ID3D12RootSignature> GetRootSignature();
+        ComPtr<ID3D12RootSignature> GetRootSignature() const;
 
       private:
         std::array<uint32_t, kMaxBindGroups> mCbvUavSrvRootParameterInfo;
diff --git a/src/tests/end2end/DynamicBufferOffsetTests.cpp b/src/tests/end2end/DynamicBufferOffsetTests.cpp
index f55b9e5..ee0315b 100644
--- a/src/tests/end2end/DynamicBufferOffsetTests.cpp
+++ b/src/tests/end2end/DynamicBufferOffsetTests.cpp
@@ -33,14 +33,15 @@
         uniformData[0] = 1;
         uniformData[1] = 2;
 
-        mUniformBuffer = utils::CreateBufferFromData(device, uniformData.data(), kBufferSize,
-                                                     dawn::BufferUsageBit::Uniform);
+        mUniformBuffers[0] = utils::CreateBufferFromData(device, uniformData.data(), kBufferSize,
+                                                         dawn::BufferUsageBit::Uniform);
 
         uniformData[uniformData.size() - 2] = 5;
         uniformData[uniformData.size() - 1] = 6;
 
-        mDynamicUniformBuffer = utils::CreateBufferFromData(device, uniformData.data(), kBufferSize,
-                                                            dawn::BufferUsageBit::Uniform);
+        // Dynamic uniform buffer
+        mUniformBuffers[1] = utils::CreateBufferFromData(device, uniformData.data(), kBufferSize,
+                                                         dawn::BufferUsageBit::Uniform);
 
         dawn::BufferDescriptor storageBufferDescriptor;
         storageBufferDescriptor.size = kBufferSize;
@@ -48,11 +49,13 @@
                                         dawn::BufferUsageBit::CopyDst |
                                         dawn::BufferUsageBit::CopySrc;
 
-        mStorageBuffer = device.CreateBuffer(&storageBufferDescriptor);
+        mStorageBuffers[0] = device.CreateBuffer(&storageBufferDescriptor);
 
-        mDynamicStorageBuffer = device.CreateBuffer(&storageBufferDescriptor);
+        // Dynamic storage buffer
+        mStorageBuffers[1] = device.CreateBuffer(&storageBufferDescriptor);
 
-        mBindGroupLayout = utils::MakeBindGroupLayout(
+        // Default bind group layout
+        mBindGroupLayouts[0] = utils::MakeBindGroupLayout(
             device, {{0, dawn::ShaderStageBit::Compute | dawn::ShaderStageBit::Fragment,
                       dawn::BindingType::UniformBuffer},
                      {1, dawn::ShaderStageBit::Compute | dawn::ShaderStageBit::Fragment,
@@ -62,23 +65,35 @@
                      {4, dawn::ShaderStageBit::Compute | dawn::ShaderStageBit::Fragment,
                       dawn::BindingType::StorageBuffer, true}});
 
-        mBindGroup = utils::MakeBindGroup(device, mBindGroupLayout,
-                                          {{0, mUniformBuffer, 0, kBindingSize},
-                                           {1, mStorageBuffer, 0, kBindingSize},
-                                           {3, mDynamicUniformBuffer, 0, kBindingSize},
-                                           {4, mDynamicStorageBuffer, 0, kBindingSize}});
+        // Default bind group
+        mBindGroups[0] = utils::MakeBindGroup(device, mBindGroupLayouts[0],
+                                              {{0, mUniformBuffers[0], 0, kBindingSize},
+                                               {1, mStorageBuffers[0], 0, kBindingSize},
+                                               {3, mUniformBuffers[1], 0, kBindingSize},
+                                               {4, mStorageBuffers[1], 0, kBindingSize}});
+
+        // Extra uniform buffer for inheriting test
+        mUniformBuffers[2] = utils::CreateBufferFromData(device, uniformData.data(), kBufferSize,
+                                                         dawn::BufferUsageBit::Uniform);
+
+        // Bind group layout for inheriting test
+        mBindGroupLayouts[1] = utils::MakeBindGroupLayout(
+            device, {{0, dawn::ShaderStageBit::Compute | dawn::ShaderStageBit::Fragment,
+                      dawn::BindingType::UniformBuffer}});
+
+        // Bind group for inheriting test
+        mBindGroups[1] = utils::MakeBindGroup(device, mBindGroupLayouts[1],
+                                              {{0, mUniformBuffers[2], 0, kBindingSize}});
     }
     // Create objects to use as resources inside test bind groups.
 
-    dawn::BindGroup mBindGroup;
-    dawn::BindGroupLayout mBindGroupLayout;
-    dawn::Buffer mUniformBuffer;
-    dawn::Buffer mStorageBuffer;
-    dawn::Buffer mDynamicUniformBuffer;
-    dawn::Buffer mDynamicStorageBuffer;
+    dawn::BindGroup mBindGroups[2];
+    dawn::BindGroupLayout mBindGroupLayouts[2];
+    dawn::Buffer mUniformBuffers[3];
+    dawn::Buffer mStorageBuffers[2];
     dawn::Texture mColorAttachment;
 
-    dawn::RenderPipeline CreateRenderPipeline() {
+    dawn::RenderPipeline CreateRenderPipeline(bool isInheritedPipeline = false) {
         dawn::ShaderModule vsModule =
             utils::CreateShaderModule(device, utils::ShaderStage::Vertex, R"(
                 #version 450
@@ -87,72 +102,113 @@
                     gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);
                 })");
 
+        // Construct fragment shader source
+        std::ostringstream fs;
+        std::string multipleNumber = isInheritedPipeline ? "2" : "1";
+        fs << R"(
+            #version 450
+            layout(std140, set = 0, binding = 0) uniform uBufferNotDynamic {
+                uvec2 notDynamicValue;
+            };
+            layout(std140, set = 0, binding = 1) buffer sBufferNotDynamic {
+                uvec2 notDynamicResult;
+            } mid;
+            layout(std140, set = 0, binding = 3) uniform uBuffer {
+                uvec2 value;
+            };
+            layout(std140, set = 0, binding = 4) buffer SBuffer {
+                uvec2 result;
+            } sBuffer;
+        )";
+
+        if (isInheritedPipeline) {
+            fs << R"(
+                layout(std140, set = 1, binding = 0) uniform paddingBlock {
+                    uvec2 padding;
+                };
+            )";
+        }
+
+        fs << " layout(location = 0) out vec4 fragColor;\n";
+        fs << " void main() {\n";
+        fs << "     mid.notDynamicResult.xy = notDynamicValue.xy;\n";
+        fs << "     sBuffer.result.xy = " << multipleNumber
+           << " * (value.xy + mid.notDynamicResult.xy);\n";
+        fs << "     fragColor = vec4(value.x / 255.0f, value.y / 255.0f, 1.0f, 1.0f);\n";
+        fs << " }\n";
+
         dawn::ShaderModule fsModule =
-            utils::CreateShaderModule(device, utils::ShaderStage::Fragment, R"(
-                #version 450
-                layout(std140, set = 0, binding = 0) uniform uBufferNotDynamic {
-                    uvec2 notDynamicValue;
-                };
-                layout(std140, set = 0, binding = 1) buffer sBufferNotDynamic {
-                    uvec2 notDynamicResult;
-                } mid;
-                layout(std140, set = 0, binding = 3) uniform uBuffer {
-                     uvec2 value;
-                };
-                layout(std140, set = 0, binding = 4) buffer SBuffer {
-                     uvec2 result;
-                } sBuffer;
-                layout(location = 0) out vec4 fragColor;
-                void main() {
-                    mid.notDynamicResult.xy = notDynamicValue.xy;
-                    sBuffer.result.xy = value.xy + mid.notDynamicResult.xy;
-                    fragColor = vec4(value.x / 255.0f, value.y / 255.0f, 1.0f, 1.0f);
-                })");
+            utils::CreateShaderModule(device, utils::ShaderStage::Fragment, fs.str().c_str());
 
         utils::ComboRenderPipelineDescriptor pipelineDescriptor(device);
         pipelineDescriptor.cVertexStage.module = vsModule;
         pipelineDescriptor.cFragmentStage.module = fsModule;
         pipelineDescriptor.cColorStates[0]->format = dawn::TextureFormat::RGBA8Unorm;
-        dawn::PipelineLayout pipelineLayout =
-            utils::MakeBasicPipelineLayout(device, &mBindGroupLayout);
-        pipelineDescriptor.layout = pipelineLayout;
+
+        dawn::PipelineLayoutDescriptor pipelineLayoutDescriptor;
+        if (isInheritedPipeline) {
+            pipelineLayoutDescriptor.bindGroupLayoutCount = 2;
+        } else {
+            pipelineLayoutDescriptor.bindGroupLayoutCount = 1;
+        }
+        pipelineLayoutDescriptor.bindGroupLayouts = mBindGroupLayouts;
+        pipelineDescriptor.layout = device.CreatePipelineLayout(&pipelineLayoutDescriptor);
 
         return device.CreateRenderPipeline(&pipelineDescriptor);
     }
 
-    dawn::ComputePipeline CreateComputePipeline() {
-        dawn::ShaderModule csModule =
-            utils::CreateShaderModule(device, utils::ShaderStage::Compute, R"(
-                #version 450
-                layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-                layout(std140, set = 0, binding = 0) uniform uBufferNotDynamic {
-                    uvec2 notDynamicValue;
-                };
-                layout(std140, set = 0, binding = 1) buffer sBufferNotDynamic {
-                    uvec2 notDynamicResult;
-                } mid;
-                layout(std140, set = 0, binding = 3) uniform uBuffer {
-                     uvec2 value;
-                };
-                layout(std140, set = 0, binding = 4) buffer SBuffer {
-                     uvec2 result;
-                } sBuffer;
+    dawn::ComputePipeline CreateComputePipeline(bool isInheritedPipeline = false) {
+        // Construct compute shader source
+        std::ostringstream cs;
+        std::string multipleNumber = isInheritedPipeline ? "2" : "1";
+        cs << R"(
+            #version 450
+            layout(std140, set = 0, binding = 0) uniform uBufferNotDynamic {
+                uvec2 notDynamicValue;
+            };
+            layout(std140, set = 0, binding = 1) buffer sBufferNotDynamic {
+                uvec2 notDynamicResult;
+            } mid;
+            layout(std140, set = 0, binding = 3) uniform uBuffer {
+                uvec2 value;
+            };
+            layout(std140, set = 0, binding = 4) buffer SBuffer {
+                uvec2 result;
+            } sBuffer;
+        )";
 
-                void main() {
-                    mid.notDynamicResult.xy = notDynamicValue.xy;
-                    sBuffer.result.xy = value.xy + mid.notDynamicResult.xy;
-                })");
+        if (isInheritedPipeline) {
+            cs << R"(
+                layout(std140, set = 1, binding = 0) uniform paddingBlock {
+                    uvec2 padding;
+                };
+            )";
+        }
+
+        cs << " void main() {\n";
+        cs << "     mid.notDynamicResult.xy = notDynamicValue.xy;\n";
+        cs << "     sBuffer.result.xy = " << multipleNumber
+           << " * (value.xy + mid.notDynamicResult.xy);\n";
+        cs << " }\n";
+
+        dawn::ShaderModule csModule =
+            utils::CreateShaderModule(device, utils::ShaderStage::Compute, cs.str().c_str());
 
         dawn::ComputePipelineDescriptor csDesc;
-        dawn::PipelineLayout pipelineLayout =
-            utils::MakeBasicPipelineLayout(device, &mBindGroupLayout);
-        csDesc.layout = pipelineLayout;
-
         dawn::PipelineStageDescriptor computeStage;
         computeStage.module = csModule;
         computeStage.entryPoint = "main";
         csDesc.computeStage = &computeStage;
 
+        dawn::PipelineLayoutDescriptor pipelineLayoutDescriptor;
+        if (isInheritedPipeline) {
+            pipelineLayoutDescriptor.bindGroupLayoutCount = 2;
+        } else {
+            pipelineLayoutDescriptor.bindGroupLayoutCount = 1;
+        }
+        pipelineLayoutDescriptor.bindGroupLayouts = mBindGroupLayouts;
+        csDesc.layout = device.CreatePipelineLayout(&pipelineLayoutDescriptor);
+
         return device.CreateComputePipeline(&csDesc);
     }
 };
@@ -167,7 +223,7 @@
     dawn::RenderPassEncoder renderPassEncoder =
         commandEncoder.BeginRenderPass(&renderPass.renderPassInfo);
     renderPassEncoder.SetPipeline(pipeline);
-    renderPassEncoder.SetBindGroup(0, mBindGroup, offsets.size(), offsets.data());
+    renderPassEncoder.SetBindGroup(0, mBindGroups[0], offsets.size(), offsets.data());
     renderPassEncoder.Draw(3, 1, 0, 0);
     renderPassEncoder.EndPass();
     dawn::CommandBuffer commands = commandEncoder.Finish();
@@ -175,7 +231,7 @@
 
     std::vector<uint32_t> expectedData = {2, 4};
     EXPECT_PIXEL_RGBA8_EQ(RGBA8(1, 2, 255, 255), renderPass.color, 0, 0);
-    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mDynamicStorageBuffer, 0, expectedData.size());
+    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mStorageBuffers[1], 0, expectedData.size());
 }
 
 // Have non-zero dynamic offsets.
@@ -189,7 +245,7 @@
     dawn::RenderPassEncoder renderPassEncoder =
         commandEncoder.BeginRenderPass(&renderPass.renderPassInfo);
     renderPassEncoder.SetPipeline(pipeline);
-    renderPassEncoder.SetBindGroup(0, mBindGroup, offsets.size(), offsets.data());
+    renderPassEncoder.SetBindGroup(0, mBindGroups[0], offsets.size(), offsets.data());
     renderPassEncoder.Draw(3, 1, 0, 0);
     renderPassEncoder.EndPass();
     dawn::CommandBuffer commands = commandEncoder.Finish();
@@ -197,7 +253,7 @@
 
     std::vector<uint32_t> expectedData = {6, 8};
     EXPECT_PIXEL_RGBA8_EQ(RGBA8(5, 6, 255, 255), renderPass.color, 0, 0);
-    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mDynamicStorageBuffer,
+    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mStorageBuffers[1],
                                kMinDynamicBufferOffsetAlignment, expectedData.size());
 }
 
@@ -210,14 +266,14 @@
     dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder();
     dawn::ComputePassEncoder computePassEncoder = commandEncoder.BeginComputePass();
     computePassEncoder.SetPipeline(pipeline);
-    computePassEncoder.SetBindGroup(0, mBindGroup, offsets.size(), offsets.data());
+    computePassEncoder.SetBindGroup(0, mBindGroups[0], offsets.size(), offsets.data());
     computePassEncoder.Dispatch(1, 1, 1);
     computePassEncoder.EndPass();
     dawn::CommandBuffer commands = commandEncoder.Finish();
     queue.Submit(1, &commands);
 
     std::vector<uint32_t> expectedData = {2, 4};
-    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mDynamicStorageBuffer, 0, expectedData.size());
+    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mStorageBuffers[1], 0, expectedData.size());
 }
 
 // Have non-zero dynamic offsets.
@@ -230,17 +286,127 @@
     dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder();
     dawn::ComputePassEncoder computePassEncoder = commandEncoder.BeginComputePass();
     computePassEncoder.SetPipeline(pipeline);
-    computePassEncoder.SetBindGroup(0, mBindGroup, offsets.size(), offsets.data());
+    computePassEncoder.SetBindGroup(0, mBindGroups[0], offsets.size(), offsets.data());
     computePassEncoder.Dispatch(1, 1, 1);
     computePassEncoder.EndPass();
     dawn::CommandBuffer commands = commandEncoder.Finish();
     queue.Submit(1, &commands);
 
     std::vector<uint32_t> expectedData = {6, 8};
-    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mDynamicStorageBuffer,
+    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mStorageBuffers[1],
                                kMinDynamicBufferOffsetAlignment, expectedData.size());
 }
 
+// Test inherit dynamic offsets on render pipeline
+TEST_P(DynamicBufferOffsetTests, InheritDynamicOffestsRenderPipeline) {
+    // Using default pipeline and setting dynamic offsets
+    dawn::RenderPipeline pipeline = CreateRenderPipeline();
+    dawn::RenderPipeline testPipeline = CreateRenderPipeline(true);
+
+    utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
+
+    dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder();
+    std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment,
+                                       kMinDynamicBufferOffsetAlignment};
+    dawn::RenderPassEncoder renderPassEncoder =
+        commandEncoder.BeginRenderPass(&renderPass.renderPassInfo);
+    renderPassEncoder.SetPipeline(pipeline);
+    renderPassEncoder.SetBindGroup(0, mBindGroups[0], offsets.size(), offsets.data());
+    renderPassEncoder.Draw(3, 1, 0, 0);
+    renderPassEncoder.SetPipeline(testPipeline);
+    renderPassEncoder.SetBindGroup(1, mBindGroups[1], 0, nullptr);
+    renderPassEncoder.Draw(3, 1, 0, 0);
+    renderPassEncoder.EndPass();
+    dawn::CommandBuffer commands = commandEncoder.Finish();
+    queue.Submit(1, &commands);
+
+    std::vector<uint32_t> expectedData = {12, 16};
+    EXPECT_PIXEL_RGBA8_EQ(RGBA8(5, 6, 255, 255), renderPass.color, 0, 0);
+    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mStorageBuffers[1],
+                               kMinDynamicBufferOffsetAlignment, expectedData.size());
+}
+
+// Test inherit dynamic offsets on compute pipeline
+// TODO(shaobo.yan@intel.com) : Try this test on GTX1080 and cannot reproduce the failure.
+// Suspect it is due to dawn doesn't handle sync between two dispatch and disable this case.
+// Will double check root cause after got GTX1660.
+TEST_P(DynamicBufferOffsetTests, InheritDynamicOffestsComputePipeline) {
+    DAWN_SKIP_TEST_IF(IsWindows() && IsNvidia());
+    dawn::ComputePipeline pipeline = CreateComputePipeline();
+    dawn::ComputePipeline testPipeline = CreateComputePipeline(true);
+
+    std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment,
+                                       kMinDynamicBufferOffsetAlignment};
+
+    dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder();
+    dawn::ComputePassEncoder computePassEncoder = commandEncoder.BeginComputePass();
+    computePassEncoder.SetPipeline(pipeline);
+    computePassEncoder.SetBindGroup(0, mBindGroups[0], offsets.size(), offsets.data());
+    computePassEncoder.Dispatch(1, 1, 1);
+    computePassEncoder.SetPipeline(testPipeline);
+    computePassEncoder.SetBindGroup(1, mBindGroups[1], 0, nullptr);
+    computePassEncoder.Dispatch(1, 1, 1);
+    computePassEncoder.EndPass();
+    dawn::CommandBuffer commands = commandEncoder.Finish();
+    queue.Submit(1, &commands);
+
+    std::vector<uint32_t> expectedData = {12, 16};
+    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mStorageBuffers[1],
+                               kMinDynamicBufferOffsetAlignment, expectedData.size());
+}
+
+// Setting multiple dynamic offsets for the same bindgroup in one render pass.
+TEST_P(DynamicBufferOffsetTests, UpdateDynamicOffestsMultipleTimesRenderPipeline) {
+    // Using default pipeline and setting dynamic offsets
+    dawn::RenderPipeline pipeline = CreateRenderPipeline();
+
+    utils::BasicRenderPass renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
+
+    dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder();
+    std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment,
+                                       kMinDynamicBufferOffsetAlignment};
+    std::array<uint64_t, 2> testOffsets = {0, 0};
+
+    dawn::RenderPassEncoder renderPassEncoder =
+        commandEncoder.BeginRenderPass(&renderPass.renderPassInfo);
+    renderPassEncoder.SetPipeline(pipeline);
+    renderPassEncoder.SetBindGroup(0, mBindGroups[0], offsets.size(), offsets.data());
+    renderPassEncoder.Draw(3, 1, 0, 0);
+    renderPassEncoder.SetBindGroup(0, mBindGroups[0], testOffsets.size(), testOffsets.data());
+    renderPassEncoder.Draw(3, 1, 0, 0);
+    renderPassEncoder.EndPass();
+    dawn::CommandBuffer commands = commandEncoder.Finish();
+    queue.Submit(1, &commands);
+
+    std::vector<uint32_t> expectedData = {2, 4};
+    EXPECT_PIXEL_RGBA8_EQ(RGBA8(1, 2, 255, 255), renderPass.color, 0, 0);
+    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mStorageBuffers[1], 0, expectedData.size());
+}
+
+// Setting multiple dynamic offsets for the same bindgroup in one compute pass.
+// TODO(shaobo.yan@intel.com) : enable this test after resolving dawn issue 198.
+TEST_P(DynamicBufferOffsetTests, DISABLED_UpdateDynamicOffestsMultipleTimesComputePipeline) {
+    dawn::ComputePipeline pipeline = CreateComputePipeline();
+
+    std::array<uint64_t, 2> offsets = {kMinDynamicBufferOffsetAlignment,
+                                       kMinDynamicBufferOffsetAlignment};
+    std::array<uint64_t, 2> testOffsets = {0, 0};
+
+    dawn::CommandEncoder commandEncoder = device.CreateCommandEncoder();
+    dawn::ComputePassEncoder computePassEncoder = commandEncoder.BeginComputePass();
+    computePassEncoder.SetPipeline(pipeline);
+    computePassEncoder.SetBindGroup(0, mBindGroups[0], offsets.size(), offsets.data());
+    computePassEncoder.Dispatch(1, 1, 1);
+    computePassEncoder.SetBindGroup(0, mBindGroups[0], testOffsets.size(), testOffsets.data());
+    computePassEncoder.Dispatch(1, 1, 1);
+    computePassEncoder.EndPass();
+    dawn::CommandBuffer commands = commandEncoder.Finish();
+    queue.Submit(1, &commands);
+
+    std::vector<uint32_t> expectedData = {2, 4};
+    EXPECT_BUFFER_U32_RANGE_EQ(expectedData.data(), mStorageBuffers[1], 0, expectedData.size());
+}
+
 DAWN_INSTANTIATE_TEST(DynamicBufferOffsetTests,
                       D3D12Backend,
                       MetalBackend,
